xref: /openbmc/linux/net/bluetooth/hci_core.c (revision 4b10966f)
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>
381da177e4SLinus Torvalds 
39970c4e46SJohan Hedberg #include "smp.h"
40970c4e46SJohan Hedberg 
41b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work);
42c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work);
433eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work);
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds /* HCI device list */
461da177e4SLinus Torvalds LIST_HEAD(hci_dev_list);
471da177e4SLinus Torvalds DEFINE_RWLOCK(hci_dev_list_lock);
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds /* HCI callback list */
501da177e4SLinus Torvalds LIST_HEAD(hci_cb_list);
511da177e4SLinus Torvalds DEFINE_RWLOCK(hci_cb_list_lock);
521da177e4SLinus Torvalds 
533df92b31SSasha Levin /* HCI ID Numbering */
543df92b31SSasha Levin static DEFINE_IDA(hci_index_ida);
553df92b31SSasha Levin 
561da177e4SLinus Torvalds /* ---- HCI notifications ---- */
571da177e4SLinus Torvalds 
586516455dSMarcel Holtmann static void hci_notify(struct hci_dev *hdev, int event)
591da177e4SLinus Torvalds {
60040030efSMarcel Holtmann 	hci_sock_dev_event(hdev, event);
611da177e4SLinus Torvalds }
621da177e4SLinus Torvalds 
63baf27f6eSMarcel Holtmann /* ---- HCI debugfs entries ---- */
64baf27f6eSMarcel Holtmann 
654b4148e9SMarcel Holtmann static ssize_t dut_mode_read(struct file *file, char __user *user_buf,
664b4148e9SMarcel Holtmann 			     size_t count, loff_t *ppos)
674b4148e9SMarcel Holtmann {
684b4148e9SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
694b4148e9SMarcel Holtmann 	char buf[3];
704b4148e9SMarcel Holtmann 
71111902f7SMarcel Holtmann 	buf[0] = test_bit(HCI_DUT_MODE, &hdev->dbg_flags) ? 'Y': 'N';
724b4148e9SMarcel Holtmann 	buf[1] = '\n';
734b4148e9SMarcel Holtmann 	buf[2] = '\0';
744b4148e9SMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
754b4148e9SMarcel Holtmann }
764b4148e9SMarcel Holtmann 
774b4148e9SMarcel Holtmann static ssize_t dut_mode_write(struct file *file, const char __user *user_buf,
784b4148e9SMarcel Holtmann 			      size_t count, loff_t *ppos)
794b4148e9SMarcel Holtmann {
804b4148e9SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
814b4148e9SMarcel Holtmann 	struct sk_buff *skb;
824b4148e9SMarcel Holtmann 	char buf[32];
834b4148e9SMarcel Holtmann 	size_t buf_size = min(count, (sizeof(buf)-1));
844b4148e9SMarcel Holtmann 	bool enable;
854b4148e9SMarcel Holtmann 	int err;
864b4148e9SMarcel Holtmann 
874b4148e9SMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
884b4148e9SMarcel Holtmann 		return -ENETDOWN;
894b4148e9SMarcel Holtmann 
904b4148e9SMarcel Holtmann 	if (copy_from_user(buf, user_buf, buf_size))
914b4148e9SMarcel Holtmann 		return -EFAULT;
924b4148e9SMarcel Holtmann 
934b4148e9SMarcel Holtmann 	buf[buf_size] = '\0';
944b4148e9SMarcel Holtmann 	if (strtobool(buf, &enable))
954b4148e9SMarcel Holtmann 		return -EINVAL;
964b4148e9SMarcel Holtmann 
97111902f7SMarcel Holtmann 	if (enable == test_bit(HCI_DUT_MODE, &hdev->dbg_flags))
984b4148e9SMarcel Holtmann 		return -EALREADY;
994b4148e9SMarcel Holtmann 
1004b4148e9SMarcel Holtmann 	hci_req_lock(hdev);
1014b4148e9SMarcel Holtmann 	if (enable)
1024b4148e9SMarcel Holtmann 		skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL,
1034b4148e9SMarcel Holtmann 				     HCI_CMD_TIMEOUT);
1044b4148e9SMarcel Holtmann 	else
1054b4148e9SMarcel Holtmann 		skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL,
1064b4148e9SMarcel Holtmann 				     HCI_CMD_TIMEOUT);
1074b4148e9SMarcel Holtmann 	hci_req_unlock(hdev);
1084b4148e9SMarcel Holtmann 
1094b4148e9SMarcel Holtmann 	if (IS_ERR(skb))
1104b4148e9SMarcel Holtmann 		return PTR_ERR(skb);
1114b4148e9SMarcel Holtmann 
1124b4148e9SMarcel Holtmann 	err = -bt_to_errno(skb->data[0]);
1134b4148e9SMarcel Holtmann 	kfree_skb(skb);
1144b4148e9SMarcel Holtmann 
1154b4148e9SMarcel Holtmann 	if (err < 0)
1164b4148e9SMarcel Holtmann 		return err;
1174b4148e9SMarcel Holtmann 
118111902f7SMarcel Holtmann 	change_bit(HCI_DUT_MODE, &hdev->dbg_flags);
1194b4148e9SMarcel Holtmann 
1204b4148e9SMarcel Holtmann 	return count;
1214b4148e9SMarcel Holtmann }
1224b4148e9SMarcel Holtmann 
1234b4148e9SMarcel Holtmann static const struct file_operations dut_mode_fops = {
1244b4148e9SMarcel Holtmann 	.open		= simple_open,
1254b4148e9SMarcel Holtmann 	.read		= dut_mode_read,
1264b4148e9SMarcel Holtmann 	.write		= dut_mode_write,
1274b4148e9SMarcel Holtmann 	.llseek		= default_llseek,
1284b4148e9SMarcel Holtmann };
1294b4148e9SMarcel Holtmann 
130dfb826a8SMarcel Holtmann static int features_show(struct seq_file *f, void *ptr)
131dfb826a8SMarcel Holtmann {
132dfb826a8SMarcel Holtmann 	struct hci_dev *hdev = f->private;
133dfb826a8SMarcel Holtmann 	u8 p;
134dfb826a8SMarcel Holtmann 
135dfb826a8SMarcel Holtmann 	hci_dev_lock(hdev);
136dfb826a8SMarcel Holtmann 	for (p = 0; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
137cfbb2b5bSMarcel Holtmann 		seq_printf(f, "%2u: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x "
138dfb826a8SMarcel Holtmann 			   "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", p,
139dfb826a8SMarcel Holtmann 			   hdev->features[p][0], hdev->features[p][1],
140dfb826a8SMarcel Holtmann 			   hdev->features[p][2], hdev->features[p][3],
141dfb826a8SMarcel Holtmann 			   hdev->features[p][4], hdev->features[p][5],
142dfb826a8SMarcel Holtmann 			   hdev->features[p][6], hdev->features[p][7]);
143dfb826a8SMarcel Holtmann 	}
144cfbb2b5bSMarcel Holtmann 	if (lmp_le_capable(hdev))
145cfbb2b5bSMarcel Holtmann 		seq_printf(f, "LE: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x "
146cfbb2b5bSMarcel Holtmann 			   "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n",
147cfbb2b5bSMarcel Holtmann 			   hdev->le_features[0], hdev->le_features[1],
148cfbb2b5bSMarcel Holtmann 			   hdev->le_features[2], hdev->le_features[3],
149cfbb2b5bSMarcel Holtmann 			   hdev->le_features[4], hdev->le_features[5],
150cfbb2b5bSMarcel Holtmann 			   hdev->le_features[6], hdev->le_features[7]);
151dfb826a8SMarcel Holtmann 	hci_dev_unlock(hdev);
152dfb826a8SMarcel Holtmann 
153dfb826a8SMarcel Holtmann 	return 0;
154dfb826a8SMarcel Holtmann }
155dfb826a8SMarcel Holtmann 
156dfb826a8SMarcel Holtmann static int features_open(struct inode *inode, struct file *file)
157dfb826a8SMarcel Holtmann {
158dfb826a8SMarcel Holtmann 	return single_open(file, features_show, inode->i_private);
159dfb826a8SMarcel Holtmann }
160dfb826a8SMarcel Holtmann 
161dfb826a8SMarcel Holtmann static const struct file_operations features_fops = {
162dfb826a8SMarcel Holtmann 	.open		= features_open,
163dfb826a8SMarcel Holtmann 	.read		= seq_read,
164dfb826a8SMarcel Holtmann 	.llseek		= seq_lseek,
165dfb826a8SMarcel Holtmann 	.release	= single_release,
166dfb826a8SMarcel Holtmann };
167dfb826a8SMarcel Holtmann 
16870afe0b8SMarcel Holtmann static int blacklist_show(struct seq_file *f, void *p)
16970afe0b8SMarcel Holtmann {
17070afe0b8SMarcel Holtmann 	struct hci_dev *hdev = f->private;
17170afe0b8SMarcel Holtmann 	struct bdaddr_list *b;
17270afe0b8SMarcel Holtmann 
17370afe0b8SMarcel Holtmann 	hci_dev_lock(hdev);
17470afe0b8SMarcel Holtmann 	list_for_each_entry(b, &hdev->blacklist, list)
175b25f0785SMarcel Holtmann 		seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
17670afe0b8SMarcel Holtmann 	hci_dev_unlock(hdev);
17770afe0b8SMarcel Holtmann 
17870afe0b8SMarcel Holtmann 	return 0;
17970afe0b8SMarcel Holtmann }
18070afe0b8SMarcel Holtmann 
18170afe0b8SMarcel Holtmann static int blacklist_open(struct inode *inode, struct file *file)
18270afe0b8SMarcel Holtmann {
18370afe0b8SMarcel Holtmann 	return single_open(file, blacklist_show, inode->i_private);
18470afe0b8SMarcel Holtmann }
18570afe0b8SMarcel Holtmann 
18670afe0b8SMarcel Holtmann static const struct file_operations blacklist_fops = {
18770afe0b8SMarcel Holtmann 	.open		= blacklist_open,
18870afe0b8SMarcel Holtmann 	.read		= seq_read,
18970afe0b8SMarcel Holtmann 	.llseek		= seq_lseek,
19070afe0b8SMarcel Holtmann 	.release	= single_release,
19170afe0b8SMarcel Holtmann };
19270afe0b8SMarcel Holtmann 
19347219839SMarcel Holtmann static int uuids_show(struct seq_file *f, void *p)
19447219839SMarcel Holtmann {
19547219839SMarcel Holtmann 	struct hci_dev *hdev = f->private;
19647219839SMarcel Holtmann 	struct bt_uuid *uuid;
19747219839SMarcel Holtmann 
19847219839SMarcel Holtmann 	hci_dev_lock(hdev);
19947219839SMarcel Holtmann 	list_for_each_entry(uuid, &hdev->uuids, list) {
20058f01aa9SMarcel Holtmann 		u8 i, val[16];
20147219839SMarcel Holtmann 
20258f01aa9SMarcel Holtmann 		/* The Bluetooth UUID values are stored in big endian,
20358f01aa9SMarcel Holtmann 		 * but with reversed byte order. So convert them into
20458f01aa9SMarcel Holtmann 		 * the right order for the %pUb modifier.
20558f01aa9SMarcel Holtmann 		 */
20658f01aa9SMarcel Holtmann 		for (i = 0; i < 16; i++)
20758f01aa9SMarcel Holtmann 			val[i] = uuid->uuid[15 - i];
20847219839SMarcel Holtmann 
20958f01aa9SMarcel Holtmann 		seq_printf(f, "%pUb\n", val);
21047219839SMarcel Holtmann 	}
21147219839SMarcel Holtmann 	hci_dev_unlock(hdev);
21247219839SMarcel Holtmann 
21347219839SMarcel Holtmann 	return 0;
21447219839SMarcel Holtmann }
21547219839SMarcel Holtmann 
21647219839SMarcel Holtmann static int uuids_open(struct inode *inode, struct file *file)
21747219839SMarcel Holtmann {
21847219839SMarcel Holtmann 	return single_open(file, uuids_show, inode->i_private);
21947219839SMarcel Holtmann }
22047219839SMarcel Holtmann 
22147219839SMarcel Holtmann static const struct file_operations uuids_fops = {
22247219839SMarcel Holtmann 	.open		= uuids_open,
22347219839SMarcel Holtmann 	.read		= seq_read,
22447219839SMarcel Holtmann 	.llseek		= seq_lseek,
22547219839SMarcel Holtmann 	.release	= single_release,
22647219839SMarcel Holtmann };
22747219839SMarcel Holtmann 
228baf27f6eSMarcel Holtmann static int inquiry_cache_show(struct seq_file *f, void *p)
229baf27f6eSMarcel Holtmann {
230baf27f6eSMarcel Holtmann 	struct hci_dev *hdev = f->private;
231baf27f6eSMarcel Holtmann 	struct discovery_state *cache = &hdev->discovery;
232baf27f6eSMarcel Holtmann 	struct inquiry_entry *e;
233baf27f6eSMarcel Holtmann 
234baf27f6eSMarcel Holtmann 	hci_dev_lock(hdev);
235baf27f6eSMarcel Holtmann 
236baf27f6eSMarcel Holtmann 	list_for_each_entry(e, &cache->all, all) {
237baf27f6eSMarcel Holtmann 		struct inquiry_data *data = &e->data;
238baf27f6eSMarcel Holtmann 		seq_printf(f, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
239baf27f6eSMarcel Holtmann 			   &data->bdaddr,
240baf27f6eSMarcel Holtmann 			   data->pscan_rep_mode, data->pscan_period_mode,
241baf27f6eSMarcel Holtmann 			   data->pscan_mode, data->dev_class[2],
242baf27f6eSMarcel Holtmann 			   data->dev_class[1], data->dev_class[0],
243baf27f6eSMarcel Holtmann 			   __le16_to_cpu(data->clock_offset),
244baf27f6eSMarcel Holtmann 			   data->rssi, data->ssp_mode, e->timestamp);
245baf27f6eSMarcel Holtmann 	}
246baf27f6eSMarcel Holtmann 
247baf27f6eSMarcel Holtmann 	hci_dev_unlock(hdev);
248baf27f6eSMarcel Holtmann 
249baf27f6eSMarcel Holtmann 	return 0;
250baf27f6eSMarcel Holtmann }
251baf27f6eSMarcel Holtmann 
252baf27f6eSMarcel Holtmann static int inquiry_cache_open(struct inode *inode, struct file *file)
253baf27f6eSMarcel Holtmann {
254baf27f6eSMarcel Holtmann 	return single_open(file, inquiry_cache_show, inode->i_private);
255baf27f6eSMarcel Holtmann }
256baf27f6eSMarcel Holtmann 
257baf27f6eSMarcel Holtmann static const struct file_operations inquiry_cache_fops = {
258baf27f6eSMarcel Holtmann 	.open		= inquiry_cache_open,
259baf27f6eSMarcel Holtmann 	.read		= seq_read,
260baf27f6eSMarcel Holtmann 	.llseek		= seq_lseek,
261baf27f6eSMarcel Holtmann 	.release	= single_release,
262baf27f6eSMarcel Holtmann };
263baf27f6eSMarcel Holtmann 
26402d08d15SMarcel Holtmann static int link_keys_show(struct seq_file *f, void *ptr)
26502d08d15SMarcel Holtmann {
26602d08d15SMarcel Holtmann 	struct hci_dev *hdev = f->private;
26702d08d15SMarcel Holtmann 	struct list_head *p, *n;
26802d08d15SMarcel Holtmann 
26902d08d15SMarcel Holtmann 	hci_dev_lock(hdev);
27002d08d15SMarcel Holtmann 	list_for_each_safe(p, n, &hdev->link_keys) {
27102d08d15SMarcel Holtmann 		struct link_key *key = list_entry(p, struct link_key, list);
27202d08d15SMarcel Holtmann 		seq_printf(f, "%pMR %u %*phN %u\n", &key->bdaddr, key->type,
27302d08d15SMarcel Holtmann 			   HCI_LINK_KEY_SIZE, key->val, key->pin_len);
27402d08d15SMarcel Holtmann 	}
27502d08d15SMarcel Holtmann 	hci_dev_unlock(hdev);
27602d08d15SMarcel Holtmann 
27702d08d15SMarcel Holtmann 	return 0;
27802d08d15SMarcel Holtmann }
27902d08d15SMarcel Holtmann 
28002d08d15SMarcel Holtmann static int link_keys_open(struct inode *inode, struct file *file)
28102d08d15SMarcel Holtmann {
28202d08d15SMarcel Holtmann 	return single_open(file, link_keys_show, inode->i_private);
28302d08d15SMarcel Holtmann }
28402d08d15SMarcel Holtmann 
28502d08d15SMarcel Holtmann static const struct file_operations link_keys_fops = {
28602d08d15SMarcel Holtmann 	.open		= link_keys_open,
28702d08d15SMarcel Holtmann 	.read		= seq_read,
28802d08d15SMarcel Holtmann 	.llseek		= seq_lseek,
28902d08d15SMarcel Holtmann 	.release	= single_release,
29002d08d15SMarcel Holtmann };
29102d08d15SMarcel Holtmann 
292babdbb3cSMarcel Holtmann static int dev_class_show(struct seq_file *f, void *ptr)
293babdbb3cSMarcel Holtmann {
294babdbb3cSMarcel Holtmann 	struct hci_dev *hdev = f->private;
295babdbb3cSMarcel Holtmann 
296babdbb3cSMarcel Holtmann 	hci_dev_lock(hdev);
297babdbb3cSMarcel Holtmann 	seq_printf(f, "0x%.2x%.2x%.2x\n", hdev->dev_class[2],
298babdbb3cSMarcel Holtmann 		   hdev->dev_class[1], hdev->dev_class[0]);
299babdbb3cSMarcel Holtmann 	hci_dev_unlock(hdev);
300babdbb3cSMarcel Holtmann 
301babdbb3cSMarcel Holtmann 	return 0;
302babdbb3cSMarcel Holtmann }
303babdbb3cSMarcel Holtmann 
304babdbb3cSMarcel Holtmann static int dev_class_open(struct inode *inode, struct file *file)
305babdbb3cSMarcel Holtmann {
306babdbb3cSMarcel Holtmann 	return single_open(file, dev_class_show, inode->i_private);
307babdbb3cSMarcel Holtmann }
308babdbb3cSMarcel Holtmann 
309babdbb3cSMarcel Holtmann static const struct file_operations dev_class_fops = {
310babdbb3cSMarcel Holtmann 	.open		= dev_class_open,
311babdbb3cSMarcel Holtmann 	.read		= seq_read,
312babdbb3cSMarcel Holtmann 	.llseek		= seq_lseek,
313babdbb3cSMarcel Holtmann 	.release	= single_release,
314babdbb3cSMarcel Holtmann };
315babdbb3cSMarcel Holtmann 
316041000b9SMarcel Holtmann static int voice_setting_get(void *data, u64 *val)
317041000b9SMarcel Holtmann {
318041000b9SMarcel Holtmann 	struct hci_dev *hdev = data;
319041000b9SMarcel Holtmann 
320041000b9SMarcel Holtmann 	hci_dev_lock(hdev);
321041000b9SMarcel Holtmann 	*val = hdev->voice_setting;
322041000b9SMarcel Holtmann 	hci_dev_unlock(hdev);
323041000b9SMarcel Holtmann 
324041000b9SMarcel Holtmann 	return 0;
325041000b9SMarcel Holtmann }
326041000b9SMarcel Holtmann 
327041000b9SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops, voice_setting_get,
328041000b9SMarcel Holtmann 			NULL, "0x%4.4llx\n");
329041000b9SMarcel Holtmann 
330ebd1e33bSMarcel Holtmann static int auto_accept_delay_set(void *data, u64 val)
331ebd1e33bSMarcel Holtmann {
332ebd1e33bSMarcel Holtmann 	struct hci_dev *hdev = data;
333ebd1e33bSMarcel Holtmann 
334ebd1e33bSMarcel Holtmann 	hci_dev_lock(hdev);
335ebd1e33bSMarcel Holtmann 	hdev->auto_accept_delay = val;
336ebd1e33bSMarcel Holtmann 	hci_dev_unlock(hdev);
337ebd1e33bSMarcel Holtmann 
338ebd1e33bSMarcel Holtmann 	return 0;
339ebd1e33bSMarcel Holtmann }
340ebd1e33bSMarcel Holtmann 
341ebd1e33bSMarcel Holtmann static int auto_accept_delay_get(void *data, u64 *val)
342ebd1e33bSMarcel Holtmann {
343ebd1e33bSMarcel Holtmann 	struct hci_dev *hdev = data;
344ebd1e33bSMarcel Holtmann 
345ebd1e33bSMarcel Holtmann 	hci_dev_lock(hdev);
346ebd1e33bSMarcel Holtmann 	*val = hdev->auto_accept_delay;
347ebd1e33bSMarcel Holtmann 	hci_dev_unlock(hdev);
348ebd1e33bSMarcel Holtmann 
349ebd1e33bSMarcel Holtmann 	return 0;
350ebd1e33bSMarcel Holtmann }
351ebd1e33bSMarcel Holtmann 
352ebd1e33bSMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
353ebd1e33bSMarcel Holtmann 			auto_accept_delay_set, "%llu\n");
354ebd1e33bSMarcel Holtmann 
3555afeac14SMarcel Holtmann static ssize_t force_sc_support_read(struct file *file, char __user *user_buf,
3565afeac14SMarcel Holtmann 				     size_t count, loff_t *ppos)
3575afeac14SMarcel Holtmann {
3585afeac14SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
3595afeac14SMarcel Holtmann 	char buf[3];
3605afeac14SMarcel Holtmann 
361111902f7SMarcel Holtmann 	buf[0] = test_bit(HCI_FORCE_SC, &hdev->dbg_flags) ? 'Y': 'N';
3625afeac14SMarcel Holtmann 	buf[1] = '\n';
3635afeac14SMarcel Holtmann 	buf[2] = '\0';
3645afeac14SMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
3655afeac14SMarcel Holtmann }
3665afeac14SMarcel Holtmann 
3675afeac14SMarcel Holtmann static ssize_t force_sc_support_write(struct file *file,
3685afeac14SMarcel Holtmann 				      const char __user *user_buf,
3695afeac14SMarcel Holtmann 				      size_t count, loff_t *ppos)
3705afeac14SMarcel Holtmann {
3715afeac14SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
3725afeac14SMarcel Holtmann 	char buf[32];
3735afeac14SMarcel Holtmann 	size_t buf_size = min(count, (sizeof(buf)-1));
3745afeac14SMarcel Holtmann 	bool enable;
3755afeac14SMarcel Holtmann 
3765afeac14SMarcel Holtmann 	if (test_bit(HCI_UP, &hdev->flags))
3775afeac14SMarcel Holtmann 		return -EBUSY;
3785afeac14SMarcel Holtmann 
3795afeac14SMarcel Holtmann 	if (copy_from_user(buf, user_buf, buf_size))
3805afeac14SMarcel Holtmann 		return -EFAULT;
3815afeac14SMarcel Holtmann 
3825afeac14SMarcel Holtmann 	buf[buf_size] = '\0';
3835afeac14SMarcel Holtmann 	if (strtobool(buf, &enable))
3845afeac14SMarcel Holtmann 		return -EINVAL;
3855afeac14SMarcel Holtmann 
386111902f7SMarcel Holtmann 	if (enable == test_bit(HCI_FORCE_SC, &hdev->dbg_flags))
3875afeac14SMarcel Holtmann 		return -EALREADY;
3885afeac14SMarcel Holtmann 
389111902f7SMarcel Holtmann 	change_bit(HCI_FORCE_SC, &hdev->dbg_flags);
3905afeac14SMarcel Holtmann 
3915afeac14SMarcel Holtmann 	return count;
3925afeac14SMarcel Holtmann }
3935afeac14SMarcel Holtmann 
3945afeac14SMarcel Holtmann static const struct file_operations force_sc_support_fops = {
3955afeac14SMarcel Holtmann 	.open		= simple_open,
3965afeac14SMarcel Holtmann 	.read		= force_sc_support_read,
3975afeac14SMarcel Holtmann 	.write		= force_sc_support_write,
3985afeac14SMarcel Holtmann 	.llseek		= default_llseek,
3995afeac14SMarcel Holtmann };
4005afeac14SMarcel Holtmann 
401134c2a89SMarcel Holtmann static ssize_t sc_only_mode_read(struct file *file, char __user *user_buf,
402134c2a89SMarcel Holtmann 				 size_t count, loff_t *ppos)
403134c2a89SMarcel Holtmann {
404134c2a89SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
405134c2a89SMarcel Holtmann 	char buf[3];
406134c2a89SMarcel Holtmann 
407134c2a89SMarcel Holtmann 	buf[0] = test_bit(HCI_SC_ONLY, &hdev->dev_flags) ? 'Y': 'N';
408134c2a89SMarcel Holtmann 	buf[1] = '\n';
409134c2a89SMarcel Holtmann 	buf[2] = '\0';
410134c2a89SMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
411134c2a89SMarcel Holtmann }
412134c2a89SMarcel Holtmann 
413134c2a89SMarcel Holtmann static const struct file_operations sc_only_mode_fops = {
414134c2a89SMarcel Holtmann 	.open		= simple_open,
415134c2a89SMarcel Holtmann 	.read		= sc_only_mode_read,
416134c2a89SMarcel Holtmann 	.llseek		= default_llseek,
417134c2a89SMarcel Holtmann };
418134c2a89SMarcel Holtmann 
4192bfa3531SMarcel Holtmann static int idle_timeout_set(void *data, u64 val)
4202bfa3531SMarcel Holtmann {
4212bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
4222bfa3531SMarcel Holtmann 
4232bfa3531SMarcel Holtmann 	if (val != 0 && (val < 500 || val > 3600000))
4242bfa3531SMarcel Holtmann 		return -EINVAL;
4252bfa3531SMarcel Holtmann 
4262bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
4272bfa3531SMarcel Holtmann 	hdev->idle_timeout = val;
4282bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
4292bfa3531SMarcel Holtmann 
4302bfa3531SMarcel Holtmann 	return 0;
4312bfa3531SMarcel Holtmann }
4322bfa3531SMarcel Holtmann 
4332bfa3531SMarcel Holtmann static int idle_timeout_get(void *data, u64 *val)
4342bfa3531SMarcel Holtmann {
4352bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
4362bfa3531SMarcel Holtmann 
4372bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
4382bfa3531SMarcel Holtmann 	*val = hdev->idle_timeout;
4392bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
4402bfa3531SMarcel Holtmann 
4412bfa3531SMarcel Holtmann 	return 0;
4422bfa3531SMarcel Holtmann }
4432bfa3531SMarcel Holtmann 
4442bfa3531SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops, idle_timeout_get,
4452bfa3531SMarcel Holtmann 			idle_timeout_set, "%llu\n");
4462bfa3531SMarcel Holtmann 
447c982b2eaSJohan Hedberg static int rpa_timeout_set(void *data, u64 val)
448c982b2eaSJohan Hedberg {
449c982b2eaSJohan Hedberg 	struct hci_dev *hdev = data;
450c982b2eaSJohan Hedberg 
451c982b2eaSJohan Hedberg 	/* Require the RPA timeout to be at least 30 seconds and at most
452c982b2eaSJohan Hedberg 	 * 24 hours.
453c982b2eaSJohan Hedberg 	 */
454c982b2eaSJohan Hedberg 	if (val < 30 || val > (60 * 60 * 24))
455c982b2eaSJohan Hedberg 		return -EINVAL;
456c982b2eaSJohan Hedberg 
457c982b2eaSJohan Hedberg 	hci_dev_lock(hdev);
458c982b2eaSJohan Hedberg 	hdev->rpa_timeout = val;
459c982b2eaSJohan Hedberg 	hci_dev_unlock(hdev);
460c982b2eaSJohan Hedberg 
461c982b2eaSJohan Hedberg 	return 0;
462c982b2eaSJohan Hedberg }
463c982b2eaSJohan Hedberg 
464c982b2eaSJohan Hedberg static int rpa_timeout_get(void *data, u64 *val)
465c982b2eaSJohan Hedberg {
466c982b2eaSJohan Hedberg 	struct hci_dev *hdev = data;
467c982b2eaSJohan Hedberg 
468c982b2eaSJohan Hedberg 	hci_dev_lock(hdev);
469c982b2eaSJohan Hedberg 	*val = hdev->rpa_timeout;
470c982b2eaSJohan Hedberg 	hci_dev_unlock(hdev);
471c982b2eaSJohan Hedberg 
472c982b2eaSJohan Hedberg 	return 0;
473c982b2eaSJohan Hedberg }
474c982b2eaSJohan Hedberg 
475c982b2eaSJohan Hedberg DEFINE_SIMPLE_ATTRIBUTE(rpa_timeout_fops, rpa_timeout_get,
476c982b2eaSJohan Hedberg 			rpa_timeout_set, "%llu\n");
477c982b2eaSJohan Hedberg 
4782bfa3531SMarcel Holtmann static int sniff_min_interval_set(void *data, u64 val)
4792bfa3531SMarcel Holtmann {
4802bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
4812bfa3531SMarcel Holtmann 
4822bfa3531SMarcel Holtmann 	if (val == 0 || val % 2 || val > hdev->sniff_max_interval)
4832bfa3531SMarcel Holtmann 		return -EINVAL;
4842bfa3531SMarcel Holtmann 
4852bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
4862bfa3531SMarcel Holtmann 	hdev->sniff_min_interval = val;
4872bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
4882bfa3531SMarcel Holtmann 
4892bfa3531SMarcel Holtmann 	return 0;
4902bfa3531SMarcel Holtmann }
4912bfa3531SMarcel Holtmann 
4922bfa3531SMarcel Holtmann static int sniff_min_interval_get(void *data, u64 *val)
4932bfa3531SMarcel Holtmann {
4942bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
4952bfa3531SMarcel Holtmann 
4962bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
4972bfa3531SMarcel Holtmann 	*val = hdev->sniff_min_interval;
4982bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
4992bfa3531SMarcel Holtmann 
5002bfa3531SMarcel Holtmann 	return 0;
5012bfa3531SMarcel Holtmann }
5022bfa3531SMarcel Holtmann 
5032bfa3531SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops, sniff_min_interval_get,
5042bfa3531SMarcel Holtmann 			sniff_min_interval_set, "%llu\n");
5052bfa3531SMarcel Holtmann 
5062bfa3531SMarcel Holtmann static int sniff_max_interval_set(void *data, u64 val)
5072bfa3531SMarcel Holtmann {
5082bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
5092bfa3531SMarcel Holtmann 
5102bfa3531SMarcel Holtmann 	if (val == 0 || val % 2 || val < hdev->sniff_min_interval)
5112bfa3531SMarcel Holtmann 		return -EINVAL;
5122bfa3531SMarcel Holtmann 
5132bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
5142bfa3531SMarcel Holtmann 	hdev->sniff_max_interval = val;
5152bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
5162bfa3531SMarcel Holtmann 
5172bfa3531SMarcel Holtmann 	return 0;
5182bfa3531SMarcel Holtmann }
5192bfa3531SMarcel Holtmann 
5202bfa3531SMarcel Holtmann static int sniff_max_interval_get(void *data, u64 *val)
5212bfa3531SMarcel Holtmann {
5222bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
5232bfa3531SMarcel Holtmann 
5242bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
5252bfa3531SMarcel Holtmann 	*val = hdev->sniff_max_interval;
5262bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
5272bfa3531SMarcel Holtmann 
5282bfa3531SMarcel Holtmann 	return 0;
5292bfa3531SMarcel Holtmann }
5302bfa3531SMarcel Holtmann 
5312bfa3531SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
5322bfa3531SMarcel Holtmann 			sniff_max_interval_set, "%llu\n");
5332bfa3531SMarcel Holtmann 
53431ad1691SAndrzej Kaczmarek static int conn_info_min_age_set(void *data, u64 val)
53531ad1691SAndrzej Kaczmarek {
53631ad1691SAndrzej Kaczmarek 	struct hci_dev *hdev = data;
53731ad1691SAndrzej Kaczmarek 
53831ad1691SAndrzej Kaczmarek 	if (val == 0 || val > hdev->conn_info_max_age)
53931ad1691SAndrzej Kaczmarek 		return -EINVAL;
54031ad1691SAndrzej Kaczmarek 
54131ad1691SAndrzej Kaczmarek 	hci_dev_lock(hdev);
54231ad1691SAndrzej Kaczmarek 	hdev->conn_info_min_age = val;
54331ad1691SAndrzej Kaczmarek 	hci_dev_unlock(hdev);
54431ad1691SAndrzej Kaczmarek 
54531ad1691SAndrzej Kaczmarek 	return 0;
54631ad1691SAndrzej Kaczmarek }
54731ad1691SAndrzej Kaczmarek 
54831ad1691SAndrzej Kaczmarek static int conn_info_min_age_get(void *data, u64 *val)
54931ad1691SAndrzej Kaczmarek {
55031ad1691SAndrzej Kaczmarek 	struct hci_dev *hdev = data;
55131ad1691SAndrzej Kaczmarek 
55231ad1691SAndrzej Kaczmarek 	hci_dev_lock(hdev);
55331ad1691SAndrzej Kaczmarek 	*val = hdev->conn_info_min_age;
55431ad1691SAndrzej Kaczmarek 	hci_dev_unlock(hdev);
55531ad1691SAndrzej Kaczmarek 
55631ad1691SAndrzej Kaczmarek 	return 0;
55731ad1691SAndrzej Kaczmarek }
55831ad1691SAndrzej Kaczmarek 
55931ad1691SAndrzej Kaczmarek DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops, conn_info_min_age_get,
56031ad1691SAndrzej Kaczmarek 			conn_info_min_age_set, "%llu\n");
56131ad1691SAndrzej Kaczmarek 
56231ad1691SAndrzej Kaczmarek static int conn_info_max_age_set(void *data, u64 val)
56331ad1691SAndrzej Kaczmarek {
56431ad1691SAndrzej Kaczmarek 	struct hci_dev *hdev = data;
56531ad1691SAndrzej Kaczmarek 
56631ad1691SAndrzej Kaczmarek 	if (val == 0 || val < hdev->conn_info_min_age)
56731ad1691SAndrzej Kaczmarek 		return -EINVAL;
56831ad1691SAndrzej Kaczmarek 
56931ad1691SAndrzej Kaczmarek 	hci_dev_lock(hdev);
57031ad1691SAndrzej Kaczmarek 	hdev->conn_info_max_age = val;
57131ad1691SAndrzej Kaczmarek 	hci_dev_unlock(hdev);
57231ad1691SAndrzej Kaczmarek 
57331ad1691SAndrzej Kaczmarek 	return 0;
57431ad1691SAndrzej Kaczmarek }
57531ad1691SAndrzej Kaczmarek 
57631ad1691SAndrzej Kaczmarek static int conn_info_max_age_get(void *data, u64 *val)
57731ad1691SAndrzej Kaczmarek {
57831ad1691SAndrzej Kaczmarek 	struct hci_dev *hdev = data;
57931ad1691SAndrzej Kaczmarek 
58031ad1691SAndrzej Kaczmarek 	hci_dev_lock(hdev);
58131ad1691SAndrzej Kaczmarek 	*val = hdev->conn_info_max_age;
58231ad1691SAndrzej Kaczmarek 	hci_dev_unlock(hdev);
58331ad1691SAndrzej Kaczmarek 
58431ad1691SAndrzej Kaczmarek 	return 0;
58531ad1691SAndrzej Kaczmarek }
58631ad1691SAndrzej Kaczmarek 
58731ad1691SAndrzej Kaczmarek DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops, conn_info_max_age_get,
58831ad1691SAndrzej Kaczmarek 			conn_info_max_age_set, "%llu\n");
58931ad1691SAndrzej Kaczmarek 
590ac345813SMarcel Holtmann static int identity_show(struct seq_file *f, void *p)
591ac345813SMarcel Holtmann {
592ac345813SMarcel Holtmann 	struct hci_dev *hdev = f->private;
593a1f4c318SJohan Hedberg 	bdaddr_t addr;
594ac345813SMarcel Holtmann 	u8 addr_type;
595ac345813SMarcel Holtmann 
596ac345813SMarcel Holtmann 	hci_dev_lock(hdev);
597ac345813SMarcel Holtmann 
598a1f4c318SJohan Hedberg 	hci_copy_identity_address(hdev, &addr, &addr_type);
599ac345813SMarcel Holtmann 
600a1f4c318SJohan Hedberg 	seq_printf(f, "%pMR (type %u) %*phN %pMR\n", &addr, addr_type,
601473deef2SMarcel Holtmann 		   16, hdev->irk, &hdev->rpa);
602ac345813SMarcel Holtmann 
603ac345813SMarcel Holtmann 	hci_dev_unlock(hdev);
604ac345813SMarcel Holtmann 
605ac345813SMarcel Holtmann 	return 0;
606ac345813SMarcel Holtmann }
607ac345813SMarcel Holtmann 
608ac345813SMarcel Holtmann static int identity_open(struct inode *inode, struct file *file)
609ac345813SMarcel Holtmann {
610ac345813SMarcel Holtmann 	return single_open(file, identity_show, inode->i_private);
611ac345813SMarcel Holtmann }
612ac345813SMarcel Holtmann 
613ac345813SMarcel Holtmann static const struct file_operations identity_fops = {
614ac345813SMarcel Holtmann 	.open		= identity_open,
615ac345813SMarcel Holtmann 	.read		= seq_read,
616ac345813SMarcel Holtmann 	.llseek		= seq_lseek,
617ac345813SMarcel Holtmann 	.release	= single_release,
618ac345813SMarcel Holtmann };
619ac345813SMarcel Holtmann 
6207a4cd51dSMarcel Holtmann static int random_address_show(struct seq_file *f, void *p)
6217a4cd51dSMarcel Holtmann {
6227a4cd51dSMarcel Holtmann 	struct hci_dev *hdev = f->private;
6237a4cd51dSMarcel Holtmann 
6247a4cd51dSMarcel Holtmann 	hci_dev_lock(hdev);
6257a4cd51dSMarcel Holtmann 	seq_printf(f, "%pMR\n", &hdev->random_addr);
6267a4cd51dSMarcel Holtmann 	hci_dev_unlock(hdev);
6277a4cd51dSMarcel Holtmann 
6287a4cd51dSMarcel Holtmann 	return 0;
6297a4cd51dSMarcel Holtmann }
6307a4cd51dSMarcel Holtmann 
6317a4cd51dSMarcel Holtmann static int random_address_open(struct inode *inode, struct file *file)
6327a4cd51dSMarcel Holtmann {
6337a4cd51dSMarcel Holtmann 	return single_open(file, random_address_show, inode->i_private);
6347a4cd51dSMarcel Holtmann }
6357a4cd51dSMarcel Holtmann 
6367a4cd51dSMarcel Holtmann static const struct file_operations random_address_fops = {
6377a4cd51dSMarcel Holtmann 	.open		= random_address_open,
6387a4cd51dSMarcel Holtmann 	.read		= seq_read,
6397a4cd51dSMarcel Holtmann 	.llseek		= seq_lseek,
6407a4cd51dSMarcel Holtmann 	.release	= single_release,
6417a4cd51dSMarcel Holtmann };
6427a4cd51dSMarcel Holtmann 
643e7b8fc92SMarcel Holtmann static int static_address_show(struct seq_file *f, void *p)
644e7b8fc92SMarcel Holtmann {
645e7b8fc92SMarcel Holtmann 	struct hci_dev *hdev = f->private;
646e7b8fc92SMarcel Holtmann 
647e7b8fc92SMarcel Holtmann 	hci_dev_lock(hdev);
648e7b8fc92SMarcel Holtmann 	seq_printf(f, "%pMR\n", &hdev->static_addr);
649e7b8fc92SMarcel Holtmann 	hci_dev_unlock(hdev);
650e7b8fc92SMarcel Holtmann 
651e7b8fc92SMarcel Holtmann 	return 0;
652e7b8fc92SMarcel Holtmann }
653e7b8fc92SMarcel Holtmann 
654e7b8fc92SMarcel Holtmann static int static_address_open(struct inode *inode, struct file *file)
655e7b8fc92SMarcel Holtmann {
656e7b8fc92SMarcel Holtmann 	return single_open(file, static_address_show, inode->i_private);
657e7b8fc92SMarcel Holtmann }
658e7b8fc92SMarcel Holtmann 
659e7b8fc92SMarcel Holtmann static const struct file_operations static_address_fops = {
660e7b8fc92SMarcel Holtmann 	.open		= static_address_open,
661e7b8fc92SMarcel Holtmann 	.read		= seq_read,
662e7b8fc92SMarcel Holtmann 	.llseek		= seq_lseek,
663e7b8fc92SMarcel Holtmann 	.release	= single_release,
664e7b8fc92SMarcel Holtmann };
665e7b8fc92SMarcel Holtmann 
666b32bba6cSMarcel Holtmann static ssize_t force_static_address_read(struct file *file,
667b32bba6cSMarcel Holtmann 					 char __user *user_buf,
668b32bba6cSMarcel Holtmann 					 size_t count, loff_t *ppos)
66992202185SMarcel Holtmann {
670b32bba6cSMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
671b32bba6cSMarcel Holtmann 	char buf[3];
67292202185SMarcel Holtmann 
673111902f7SMarcel Holtmann 	buf[0] = test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ? 'Y': 'N';
674b32bba6cSMarcel Holtmann 	buf[1] = '\n';
675b32bba6cSMarcel Holtmann 	buf[2] = '\0';
676b32bba6cSMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
677b32bba6cSMarcel Holtmann }
678b32bba6cSMarcel Holtmann 
679b32bba6cSMarcel Holtmann static ssize_t force_static_address_write(struct file *file,
680b32bba6cSMarcel Holtmann 					  const char __user *user_buf,
681b32bba6cSMarcel Holtmann 					  size_t count, loff_t *ppos)
682b32bba6cSMarcel Holtmann {
683b32bba6cSMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
684b32bba6cSMarcel Holtmann 	char buf[32];
685b32bba6cSMarcel Holtmann 	size_t buf_size = min(count, (sizeof(buf)-1));
686b32bba6cSMarcel Holtmann 	bool enable;
687b32bba6cSMarcel Holtmann 
688b32bba6cSMarcel Holtmann 	if (test_bit(HCI_UP, &hdev->flags))
689b32bba6cSMarcel Holtmann 		return -EBUSY;
690b32bba6cSMarcel Holtmann 
691b32bba6cSMarcel Holtmann 	if (copy_from_user(buf, user_buf, buf_size))
692b32bba6cSMarcel Holtmann 		return -EFAULT;
693b32bba6cSMarcel Holtmann 
694b32bba6cSMarcel Holtmann 	buf[buf_size] = '\0';
695b32bba6cSMarcel Holtmann 	if (strtobool(buf, &enable))
69692202185SMarcel Holtmann 		return -EINVAL;
69792202185SMarcel Holtmann 
698111902f7SMarcel Holtmann 	if (enable == test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags))
699b32bba6cSMarcel Holtmann 		return -EALREADY;
70092202185SMarcel Holtmann 
701111902f7SMarcel Holtmann 	change_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags);
702b32bba6cSMarcel Holtmann 
703b32bba6cSMarcel Holtmann 	return count;
70492202185SMarcel Holtmann }
70592202185SMarcel Holtmann 
706b32bba6cSMarcel Holtmann static const struct file_operations force_static_address_fops = {
707b32bba6cSMarcel Holtmann 	.open		= simple_open,
708b32bba6cSMarcel Holtmann 	.read		= force_static_address_read,
709b32bba6cSMarcel Holtmann 	.write		= force_static_address_write,
710b32bba6cSMarcel Holtmann 	.llseek		= default_llseek,
711b32bba6cSMarcel Holtmann };
71292202185SMarcel Holtmann 
713d2ab0ac1SMarcel Holtmann static int white_list_show(struct seq_file *f, void *ptr)
714d2ab0ac1SMarcel Holtmann {
715d2ab0ac1SMarcel Holtmann 	struct hci_dev *hdev = f->private;
716d2ab0ac1SMarcel Holtmann 	struct bdaddr_list *b;
717d2ab0ac1SMarcel Holtmann 
718d2ab0ac1SMarcel Holtmann 	hci_dev_lock(hdev);
719d2ab0ac1SMarcel Holtmann 	list_for_each_entry(b, &hdev->le_white_list, list)
720d2ab0ac1SMarcel Holtmann 		seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
721d2ab0ac1SMarcel Holtmann 	hci_dev_unlock(hdev);
722d2ab0ac1SMarcel Holtmann 
723d2ab0ac1SMarcel Holtmann 	return 0;
724d2ab0ac1SMarcel Holtmann }
725d2ab0ac1SMarcel Holtmann 
726d2ab0ac1SMarcel Holtmann static int white_list_open(struct inode *inode, struct file *file)
727d2ab0ac1SMarcel Holtmann {
728d2ab0ac1SMarcel Holtmann 	return single_open(file, white_list_show, inode->i_private);
729d2ab0ac1SMarcel Holtmann }
730d2ab0ac1SMarcel Holtmann 
731d2ab0ac1SMarcel Holtmann static const struct file_operations white_list_fops = {
732d2ab0ac1SMarcel Holtmann 	.open		= white_list_open,
733d2ab0ac1SMarcel Holtmann 	.read		= seq_read,
734d2ab0ac1SMarcel Holtmann 	.llseek		= seq_lseek,
735d2ab0ac1SMarcel Holtmann 	.release	= single_release,
736d2ab0ac1SMarcel Holtmann };
737d2ab0ac1SMarcel Holtmann 
7383698d704SMarcel Holtmann static int identity_resolving_keys_show(struct seq_file *f, void *ptr)
7393698d704SMarcel Holtmann {
7403698d704SMarcel Holtmann 	struct hci_dev *hdev = f->private;
7413698d704SMarcel Holtmann 	struct list_head *p, *n;
7423698d704SMarcel Holtmann 
7433698d704SMarcel Holtmann 	hci_dev_lock(hdev);
7443698d704SMarcel Holtmann 	list_for_each_safe(p, n, &hdev->identity_resolving_keys) {
7453698d704SMarcel Holtmann 		struct smp_irk *irk = list_entry(p, struct smp_irk, list);
7463698d704SMarcel Holtmann 		seq_printf(f, "%pMR (type %u) %*phN %pMR\n",
7473698d704SMarcel Holtmann 			   &irk->bdaddr, irk->addr_type,
7483698d704SMarcel Holtmann 			   16, irk->val, &irk->rpa);
7493698d704SMarcel Holtmann 	}
7503698d704SMarcel Holtmann 	hci_dev_unlock(hdev);
7513698d704SMarcel Holtmann 
7523698d704SMarcel Holtmann 	return 0;
7533698d704SMarcel Holtmann }
7543698d704SMarcel Holtmann 
7553698d704SMarcel Holtmann static int identity_resolving_keys_open(struct inode *inode, struct file *file)
7563698d704SMarcel Holtmann {
7573698d704SMarcel Holtmann 	return single_open(file, identity_resolving_keys_show,
7583698d704SMarcel Holtmann 			   inode->i_private);
7593698d704SMarcel Holtmann }
7603698d704SMarcel Holtmann 
7613698d704SMarcel Holtmann static const struct file_operations identity_resolving_keys_fops = {
7623698d704SMarcel Holtmann 	.open		= identity_resolving_keys_open,
7633698d704SMarcel Holtmann 	.read		= seq_read,
7643698d704SMarcel Holtmann 	.llseek		= seq_lseek,
7653698d704SMarcel Holtmann 	.release	= single_release,
7663698d704SMarcel Holtmann };
7673698d704SMarcel Holtmann 
7688f8625cdSMarcel Holtmann static int long_term_keys_show(struct seq_file *f, void *ptr)
7698f8625cdSMarcel Holtmann {
7708f8625cdSMarcel Holtmann 	struct hci_dev *hdev = f->private;
7718f8625cdSMarcel Holtmann 	struct list_head *p, *n;
7728f8625cdSMarcel Holtmann 
7738f8625cdSMarcel Holtmann 	hci_dev_lock(hdev);
774f813f1beSJohan Hedberg 	list_for_each_safe(p, n, &hdev->long_term_keys) {
7758f8625cdSMarcel Holtmann 		struct smp_ltk *ltk = list_entry(p, struct smp_ltk, list);
776fe39c7b2SMarcel Holtmann 		seq_printf(f, "%pMR (type %u) %u 0x%02x %u %.4x %.16llx %*phN\n",
7778f8625cdSMarcel Holtmann 			   &ltk->bdaddr, ltk->bdaddr_type, ltk->authenticated,
7788f8625cdSMarcel Holtmann 			   ltk->type, ltk->enc_size, __le16_to_cpu(ltk->ediv),
779fe39c7b2SMarcel Holtmann 			   __le64_to_cpu(ltk->rand), 16, ltk->val);
7808f8625cdSMarcel Holtmann 	}
7818f8625cdSMarcel Holtmann 	hci_dev_unlock(hdev);
7828f8625cdSMarcel Holtmann 
7838f8625cdSMarcel Holtmann 	return 0;
7848f8625cdSMarcel Holtmann }
7858f8625cdSMarcel Holtmann 
7868f8625cdSMarcel Holtmann static int long_term_keys_open(struct inode *inode, struct file *file)
7878f8625cdSMarcel Holtmann {
7888f8625cdSMarcel Holtmann 	return single_open(file, long_term_keys_show, inode->i_private);
7898f8625cdSMarcel Holtmann }
7908f8625cdSMarcel Holtmann 
7918f8625cdSMarcel Holtmann static const struct file_operations long_term_keys_fops = {
7928f8625cdSMarcel Holtmann 	.open		= long_term_keys_open,
7938f8625cdSMarcel Holtmann 	.read		= seq_read,
7948f8625cdSMarcel Holtmann 	.llseek		= seq_lseek,
7958f8625cdSMarcel Holtmann 	.release	= single_release,
7968f8625cdSMarcel Holtmann };
7978f8625cdSMarcel Holtmann 
7984e70c7e7SMarcel Holtmann static int conn_min_interval_set(void *data, u64 val)
7994e70c7e7SMarcel Holtmann {
8004e70c7e7SMarcel Holtmann 	struct hci_dev *hdev = data;
8014e70c7e7SMarcel Holtmann 
8024e70c7e7SMarcel Holtmann 	if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval)
8034e70c7e7SMarcel Holtmann 		return -EINVAL;
8044e70c7e7SMarcel Holtmann 
8054e70c7e7SMarcel Holtmann 	hci_dev_lock(hdev);
8064e70c7e7SMarcel Holtmann 	hdev->le_conn_min_interval = val;
8074e70c7e7SMarcel Holtmann 	hci_dev_unlock(hdev);
8084e70c7e7SMarcel Holtmann 
8094e70c7e7SMarcel Holtmann 	return 0;
8104e70c7e7SMarcel Holtmann }
8114e70c7e7SMarcel Holtmann 
8124e70c7e7SMarcel Holtmann static int conn_min_interval_get(void *data, u64 *val)
8134e70c7e7SMarcel Holtmann {
8144e70c7e7SMarcel Holtmann 	struct hci_dev *hdev = data;
8154e70c7e7SMarcel Holtmann 
8164e70c7e7SMarcel Holtmann 	hci_dev_lock(hdev);
8174e70c7e7SMarcel Holtmann 	*val = hdev->le_conn_min_interval;
8184e70c7e7SMarcel Holtmann 	hci_dev_unlock(hdev);
8194e70c7e7SMarcel Holtmann 
8204e70c7e7SMarcel Holtmann 	return 0;
8214e70c7e7SMarcel Holtmann }
8224e70c7e7SMarcel Holtmann 
8234e70c7e7SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get,
8244e70c7e7SMarcel Holtmann 			conn_min_interval_set, "%llu\n");
8254e70c7e7SMarcel Holtmann 
8264e70c7e7SMarcel Holtmann static int conn_max_interval_set(void *data, u64 val)
8274e70c7e7SMarcel Holtmann {
8284e70c7e7SMarcel Holtmann 	struct hci_dev *hdev = data;
8294e70c7e7SMarcel Holtmann 
8304e70c7e7SMarcel Holtmann 	if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval)
8314e70c7e7SMarcel Holtmann 		return -EINVAL;
8324e70c7e7SMarcel Holtmann 
8334e70c7e7SMarcel Holtmann 	hci_dev_lock(hdev);
8344e70c7e7SMarcel Holtmann 	hdev->le_conn_max_interval = val;
8354e70c7e7SMarcel Holtmann 	hci_dev_unlock(hdev);
8364e70c7e7SMarcel Holtmann 
8374e70c7e7SMarcel Holtmann 	return 0;
8384e70c7e7SMarcel Holtmann }
8394e70c7e7SMarcel Holtmann 
8404e70c7e7SMarcel Holtmann static int conn_max_interval_get(void *data, u64 *val)
8414e70c7e7SMarcel Holtmann {
8424e70c7e7SMarcel Holtmann 	struct hci_dev *hdev = data;
8434e70c7e7SMarcel Holtmann 
8444e70c7e7SMarcel Holtmann 	hci_dev_lock(hdev);
8454e70c7e7SMarcel Holtmann 	*val = hdev->le_conn_max_interval;
8464e70c7e7SMarcel Holtmann 	hci_dev_unlock(hdev);
8474e70c7e7SMarcel Holtmann 
8484e70c7e7SMarcel Holtmann 	return 0;
8494e70c7e7SMarcel Holtmann }
8504e70c7e7SMarcel Holtmann 
8514e70c7e7SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get,
8524e70c7e7SMarcel Holtmann 			conn_max_interval_set, "%llu\n");
8534e70c7e7SMarcel Holtmann 
8543f959d46SMarcel Holtmann static int adv_channel_map_set(void *data, u64 val)
8553f959d46SMarcel Holtmann {
8563f959d46SMarcel Holtmann 	struct hci_dev *hdev = data;
8573f959d46SMarcel Holtmann 
8583f959d46SMarcel Holtmann 	if (val < 0x01 || val > 0x07)
8593f959d46SMarcel Holtmann 		return -EINVAL;
8603f959d46SMarcel Holtmann 
8613f959d46SMarcel Holtmann 	hci_dev_lock(hdev);
8623f959d46SMarcel Holtmann 	hdev->le_adv_channel_map = val;
8633f959d46SMarcel Holtmann 	hci_dev_unlock(hdev);
8643f959d46SMarcel Holtmann 
8653f959d46SMarcel Holtmann 	return 0;
8663f959d46SMarcel Holtmann }
8673f959d46SMarcel Holtmann 
8683f959d46SMarcel Holtmann static int adv_channel_map_get(void *data, u64 *val)
8693f959d46SMarcel Holtmann {
8703f959d46SMarcel Holtmann 	struct hci_dev *hdev = data;
8713f959d46SMarcel Holtmann 
8723f959d46SMarcel Holtmann 	hci_dev_lock(hdev);
8733f959d46SMarcel Holtmann 	*val = hdev->le_adv_channel_map;
8743f959d46SMarcel Holtmann 	hci_dev_unlock(hdev);
8753f959d46SMarcel Holtmann 
8763f959d46SMarcel Holtmann 	return 0;
8773f959d46SMarcel Holtmann }
8783f959d46SMarcel Holtmann 
8793f959d46SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
8803f959d46SMarcel Holtmann 			adv_channel_map_set, "%llu\n");
8813f959d46SMarcel Holtmann 
8827d474e06SAndre Guedes static int le_auto_conn_show(struct seq_file *sf, void *ptr)
8837d474e06SAndre Guedes {
8847d474e06SAndre Guedes 	struct hci_dev *hdev = sf->private;
8857d474e06SAndre Guedes 	struct hci_conn_params *p;
8867d474e06SAndre Guedes 
8877d474e06SAndre Guedes 	hci_dev_lock(hdev);
8887d474e06SAndre Guedes 
8897d474e06SAndre Guedes 	list_for_each_entry(p, &hdev->le_conn_params, list) {
8907d474e06SAndre Guedes 		seq_printf(sf, "%pMR %u %u\n", &p->addr, p->addr_type,
8917d474e06SAndre Guedes 			   p->auto_connect);
8927d474e06SAndre Guedes 	}
8937d474e06SAndre Guedes 
8947d474e06SAndre Guedes 	hci_dev_unlock(hdev);
8957d474e06SAndre Guedes 
8967d474e06SAndre Guedes 	return 0;
8977d474e06SAndre Guedes }
8987d474e06SAndre Guedes 
8997d474e06SAndre Guedes static int le_auto_conn_open(struct inode *inode, struct file *file)
9007d474e06SAndre Guedes {
9017d474e06SAndre Guedes 	return single_open(file, le_auto_conn_show, inode->i_private);
9027d474e06SAndre Guedes }
9037d474e06SAndre Guedes 
9047d474e06SAndre Guedes static ssize_t le_auto_conn_write(struct file *file, const char __user *data,
9057d474e06SAndre Guedes 				  size_t count, loff_t *offset)
9067d474e06SAndre Guedes {
9077d474e06SAndre Guedes 	struct seq_file *sf = file->private_data;
9087d474e06SAndre Guedes 	struct hci_dev *hdev = sf->private;
9097d474e06SAndre Guedes 	u8 auto_connect = 0;
9107d474e06SAndre Guedes 	bdaddr_t addr;
9117d474e06SAndre Guedes 	u8 addr_type;
9127d474e06SAndre Guedes 	char *buf;
9137d474e06SAndre Guedes 	int err = 0;
9147d474e06SAndre Guedes 	int n;
9157d474e06SAndre Guedes 
9167d474e06SAndre Guedes 	/* Don't allow partial write */
9177d474e06SAndre Guedes 	if (*offset != 0)
9187d474e06SAndre Guedes 		return -EINVAL;
9197d474e06SAndre Guedes 
9207d474e06SAndre Guedes 	if (count < 3)
9217d474e06SAndre Guedes 		return -EINVAL;
9227d474e06SAndre Guedes 
9234408dd15SAndre Guedes 	buf = memdup_user(data, count);
9244408dd15SAndre Guedes 	if (IS_ERR(buf))
9254408dd15SAndre Guedes 		return PTR_ERR(buf);
9267d474e06SAndre Guedes 
9277d474e06SAndre Guedes 	if (memcmp(buf, "add", 3) == 0) {
9287d474e06SAndre Guedes 		n = sscanf(&buf[4], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu %hhu",
9297d474e06SAndre Guedes 			   &addr.b[5], &addr.b[4], &addr.b[3], &addr.b[2],
9307d474e06SAndre Guedes 			   &addr.b[1], &addr.b[0], &addr_type,
9317d474e06SAndre Guedes 			   &auto_connect);
9327d474e06SAndre Guedes 
9337d474e06SAndre Guedes 		if (n < 7) {
9347d474e06SAndre Guedes 			err = -EINVAL;
9357d474e06SAndre Guedes 			goto done;
9367d474e06SAndre Guedes 		}
9377d474e06SAndre Guedes 
9387d474e06SAndre Guedes 		hci_dev_lock(hdev);
9397d474e06SAndre Guedes 		err = hci_conn_params_add(hdev, &addr, addr_type, auto_connect,
9407d474e06SAndre Guedes 					  hdev->le_conn_min_interval,
9417d474e06SAndre Guedes 					  hdev->le_conn_max_interval);
9427d474e06SAndre Guedes 		hci_dev_unlock(hdev);
9437d474e06SAndre Guedes 
9447d474e06SAndre Guedes 		if (err)
9457d474e06SAndre Guedes 			goto done;
9467d474e06SAndre Guedes 	} else if (memcmp(buf, "del", 3) == 0) {
9477d474e06SAndre Guedes 		n = sscanf(&buf[4], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu",
9487d474e06SAndre Guedes 			   &addr.b[5], &addr.b[4], &addr.b[3], &addr.b[2],
9497d474e06SAndre Guedes 			   &addr.b[1], &addr.b[0], &addr_type);
9507d474e06SAndre Guedes 
9517d474e06SAndre Guedes 		if (n < 7) {
9527d474e06SAndre Guedes 			err = -EINVAL;
9537d474e06SAndre Guedes 			goto done;
9547d474e06SAndre Guedes 		}
9557d474e06SAndre Guedes 
9567d474e06SAndre Guedes 		hci_dev_lock(hdev);
9577d474e06SAndre Guedes 		hci_conn_params_del(hdev, &addr, addr_type);
9587d474e06SAndre Guedes 		hci_dev_unlock(hdev);
9597d474e06SAndre Guedes 	} else if (memcmp(buf, "clr", 3) == 0) {
9607d474e06SAndre Guedes 		hci_dev_lock(hdev);
9617d474e06SAndre Guedes 		hci_conn_params_clear(hdev);
9627d474e06SAndre Guedes 		hci_pend_le_conns_clear(hdev);
9637d474e06SAndre Guedes 		hci_update_background_scan(hdev);
9647d474e06SAndre Guedes 		hci_dev_unlock(hdev);
9657d474e06SAndre Guedes 	} else {
9667d474e06SAndre Guedes 		err = -EINVAL;
9677d474e06SAndre Guedes 	}
9687d474e06SAndre Guedes 
9697d474e06SAndre Guedes done:
9707d474e06SAndre Guedes 	kfree(buf);
9717d474e06SAndre Guedes 
9727d474e06SAndre Guedes 	if (err)
9737d474e06SAndre Guedes 		return err;
9747d474e06SAndre Guedes 	else
9757d474e06SAndre Guedes 		return count;
9767d474e06SAndre Guedes }
9777d474e06SAndre Guedes 
9787d474e06SAndre Guedes static const struct file_operations le_auto_conn_fops = {
9797d474e06SAndre Guedes 	.open		= le_auto_conn_open,
9807d474e06SAndre Guedes 	.read		= seq_read,
9817d474e06SAndre Guedes 	.write		= le_auto_conn_write,
9827d474e06SAndre Guedes 	.llseek		= seq_lseek,
9837d474e06SAndre Guedes 	.release	= single_release,
9847d474e06SAndre Guedes };
9857d474e06SAndre Guedes 
9861da177e4SLinus Torvalds /* ---- HCI requests ---- */
9871da177e4SLinus Torvalds 
98842c6b129SJohan Hedberg static void hci_req_sync_complete(struct hci_dev *hdev, u8 result)
9891da177e4SLinus Torvalds {
99042c6b129SJohan Hedberg 	BT_DBG("%s result 0x%2.2x", hdev->name, result);
99175fb0e32SJohan Hedberg 
9921da177e4SLinus Torvalds 	if (hdev->req_status == HCI_REQ_PEND) {
9931da177e4SLinus Torvalds 		hdev->req_result = result;
9941da177e4SLinus Torvalds 		hdev->req_status = HCI_REQ_DONE;
9951da177e4SLinus Torvalds 		wake_up_interruptible(&hdev->req_wait_q);
9961da177e4SLinus Torvalds 	}
9971da177e4SLinus Torvalds }
9981da177e4SLinus Torvalds 
9991da177e4SLinus Torvalds static void hci_req_cancel(struct hci_dev *hdev, int err)
10001da177e4SLinus Torvalds {
10011da177e4SLinus Torvalds 	BT_DBG("%s err 0x%2.2x", hdev->name, err);
10021da177e4SLinus Torvalds 
10031da177e4SLinus Torvalds 	if (hdev->req_status == HCI_REQ_PEND) {
10041da177e4SLinus Torvalds 		hdev->req_result = err;
10051da177e4SLinus Torvalds 		hdev->req_status = HCI_REQ_CANCELED;
10061da177e4SLinus Torvalds 		wake_up_interruptible(&hdev->req_wait_q);
10071da177e4SLinus Torvalds 	}
10081da177e4SLinus Torvalds }
10091da177e4SLinus Torvalds 
101077a63e0aSFengguang Wu static struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
101177a63e0aSFengguang Wu 					    u8 event)
101275e84b7cSJohan Hedberg {
101375e84b7cSJohan Hedberg 	struct hci_ev_cmd_complete *ev;
101475e84b7cSJohan Hedberg 	struct hci_event_hdr *hdr;
101575e84b7cSJohan Hedberg 	struct sk_buff *skb;
101675e84b7cSJohan Hedberg 
101775e84b7cSJohan Hedberg 	hci_dev_lock(hdev);
101875e84b7cSJohan Hedberg 
101975e84b7cSJohan Hedberg 	skb = hdev->recv_evt;
102075e84b7cSJohan Hedberg 	hdev->recv_evt = NULL;
102175e84b7cSJohan Hedberg 
102275e84b7cSJohan Hedberg 	hci_dev_unlock(hdev);
102375e84b7cSJohan Hedberg 
102475e84b7cSJohan Hedberg 	if (!skb)
102575e84b7cSJohan Hedberg 		return ERR_PTR(-ENODATA);
102675e84b7cSJohan Hedberg 
102775e84b7cSJohan Hedberg 	if (skb->len < sizeof(*hdr)) {
102875e84b7cSJohan Hedberg 		BT_ERR("Too short HCI event");
102975e84b7cSJohan Hedberg 		goto failed;
103075e84b7cSJohan Hedberg 	}
103175e84b7cSJohan Hedberg 
103275e84b7cSJohan Hedberg 	hdr = (void *) skb->data;
103375e84b7cSJohan Hedberg 	skb_pull(skb, HCI_EVENT_HDR_SIZE);
103475e84b7cSJohan Hedberg 
10357b1abbbeSJohan Hedberg 	if (event) {
10367b1abbbeSJohan Hedberg 		if (hdr->evt != event)
10377b1abbbeSJohan Hedberg 			goto failed;
10387b1abbbeSJohan Hedberg 		return skb;
10397b1abbbeSJohan Hedberg 	}
10407b1abbbeSJohan Hedberg 
104175e84b7cSJohan Hedberg 	if (hdr->evt != HCI_EV_CMD_COMPLETE) {
104275e84b7cSJohan Hedberg 		BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt);
104375e84b7cSJohan Hedberg 		goto failed;
104475e84b7cSJohan Hedberg 	}
104575e84b7cSJohan Hedberg 
104675e84b7cSJohan Hedberg 	if (skb->len < sizeof(*ev)) {
104775e84b7cSJohan Hedberg 		BT_ERR("Too short cmd_complete event");
104875e84b7cSJohan Hedberg 		goto failed;
104975e84b7cSJohan Hedberg 	}
105075e84b7cSJohan Hedberg 
105175e84b7cSJohan Hedberg 	ev = (void *) skb->data;
105275e84b7cSJohan Hedberg 	skb_pull(skb, sizeof(*ev));
105375e84b7cSJohan Hedberg 
105475e84b7cSJohan Hedberg 	if (opcode == __le16_to_cpu(ev->opcode))
105575e84b7cSJohan Hedberg 		return skb;
105675e84b7cSJohan Hedberg 
105775e84b7cSJohan Hedberg 	BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
105875e84b7cSJohan Hedberg 	       __le16_to_cpu(ev->opcode));
105975e84b7cSJohan Hedberg 
106075e84b7cSJohan Hedberg failed:
106175e84b7cSJohan Hedberg 	kfree_skb(skb);
106275e84b7cSJohan Hedberg 	return ERR_PTR(-ENODATA);
106375e84b7cSJohan Hedberg }
106475e84b7cSJohan Hedberg 
10657b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
106607dc93ddSJohan Hedberg 				  const void *param, u8 event, u32 timeout)
106775e84b7cSJohan Hedberg {
106875e84b7cSJohan Hedberg 	DECLARE_WAITQUEUE(wait, current);
106975e84b7cSJohan Hedberg 	struct hci_request req;
107075e84b7cSJohan Hedberg 	int err = 0;
107175e84b7cSJohan Hedberg 
107275e84b7cSJohan Hedberg 	BT_DBG("%s", hdev->name);
107375e84b7cSJohan Hedberg 
107475e84b7cSJohan Hedberg 	hci_req_init(&req, hdev);
107575e84b7cSJohan Hedberg 
10767b1abbbeSJohan Hedberg 	hci_req_add_ev(&req, opcode, plen, param, event);
107775e84b7cSJohan Hedberg 
107875e84b7cSJohan Hedberg 	hdev->req_status = HCI_REQ_PEND;
107975e84b7cSJohan Hedberg 
108075e84b7cSJohan Hedberg 	err = hci_req_run(&req, hci_req_sync_complete);
108175e84b7cSJohan Hedberg 	if (err < 0)
108275e84b7cSJohan Hedberg 		return ERR_PTR(err);
108375e84b7cSJohan Hedberg 
108475e84b7cSJohan Hedberg 	add_wait_queue(&hdev->req_wait_q, &wait);
108575e84b7cSJohan Hedberg 	set_current_state(TASK_INTERRUPTIBLE);
108675e84b7cSJohan Hedberg 
108775e84b7cSJohan Hedberg 	schedule_timeout(timeout);
108875e84b7cSJohan Hedberg 
108975e84b7cSJohan Hedberg 	remove_wait_queue(&hdev->req_wait_q, &wait);
109075e84b7cSJohan Hedberg 
109175e84b7cSJohan Hedberg 	if (signal_pending(current))
109275e84b7cSJohan Hedberg 		return ERR_PTR(-EINTR);
109375e84b7cSJohan Hedberg 
109475e84b7cSJohan Hedberg 	switch (hdev->req_status) {
109575e84b7cSJohan Hedberg 	case HCI_REQ_DONE:
109675e84b7cSJohan Hedberg 		err = -bt_to_errno(hdev->req_result);
109775e84b7cSJohan Hedberg 		break;
109875e84b7cSJohan Hedberg 
109975e84b7cSJohan Hedberg 	case HCI_REQ_CANCELED:
110075e84b7cSJohan Hedberg 		err = -hdev->req_result;
110175e84b7cSJohan Hedberg 		break;
110275e84b7cSJohan Hedberg 
110375e84b7cSJohan Hedberg 	default:
110475e84b7cSJohan Hedberg 		err = -ETIMEDOUT;
110575e84b7cSJohan Hedberg 		break;
110675e84b7cSJohan Hedberg 	}
110775e84b7cSJohan Hedberg 
110875e84b7cSJohan Hedberg 	hdev->req_status = hdev->req_result = 0;
110975e84b7cSJohan Hedberg 
111075e84b7cSJohan Hedberg 	BT_DBG("%s end: err %d", hdev->name, err);
111175e84b7cSJohan Hedberg 
111275e84b7cSJohan Hedberg 	if (err < 0)
111375e84b7cSJohan Hedberg 		return ERR_PTR(err);
111475e84b7cSJohan Hedberg 
11157b1abbbeSJohan Hedberg 	return hci_get_cmd_complete(hdev, opcode, event);
11167b1abbbeSJohan Hedberg }
11177b1abbbeSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync_ev);
11187b1abbbeSJohan Hedberg 
11197b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
112007dc93ddSJohan Hedberg 			       const void *param, u32 timeout)
11217b1abbbeSJohan Hedberg {
11227b1abbbeSJohan Hedberg 	return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout);
112375e84b7cSJohan Hedberg }
112475e84b7cSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync);
112575e84b7cSJohan Hedberg 
11261da177e4SLinus Torvalds /* Execute request and wait for completion. */
112701178cd4SJohan Hedberg static int __hci_req_sync(struct hci_dev *hdev,
112842c6b129SJohan Hedberg 			  void (*func)(struct hci_request *req,
112942c6b129SJohan Hedberg 				      unsigned long opt),
11301da177e4SLinus Torvalds 			  unsigned long opt, __u32 timeout)
11311da177e4SLinus Torvalds {
113242c6b129SJohan Hedberg 	struct hci_request req;
11331da177e4SLinus Torvalds 	DECLARE_WAITQUEUE(wait, current);
11341da177e4SLinus Torvalds 	int err = 0;
11351da177e4SLinus Torvalds 
11361da177e4SLinus Torvalds 	BT_DBG("%s start", hdev->name);
11371da177e4SLinus Torvalds 
113842c6b129SJohan Hedberg 	hci_req_init(&req, hdev);
113942c6b129SJohan Hedberg 
11401da177e4SLinus Torvalds 	hdev->req_status = HCI_REQ_PEND;
11411da177e4SLinus Torvalds 
114242c6b129SJohan Hedberg 	func(&req, opt);
114353cce22dSJohan Hedberg 
114442c6b129SJohan Hedberg 	err = hci_req_run(&req, hci_req_sync_complete);
114542c6b129SJohan Hedberg 	if (err < 0) {
114653cce22dSJohan Hedberg 		hdev->req_status = 0;
1147920c8300SAndre Guedes 
1148920c8300SAndre Guedes 		/* ENODATA means the HCI request command queue is empty.
1149920c8300SAndre Guedes 		 * This can happen when a request with conditionals doesn't
1150920c8300SAndre Guedes 		 * trigger any commands to be sent. This is normal behavior
1151920c8300SAndre Guedes 		 * and should not trigger an error return.
115242c6b129SJohan Hedberg 		 */
1153920c8300SAndre Guedes 		if (err == -ENODATA)
115442c6b129SJohan Hedberg 			return 0;
1155920c8300SAndre Guedes 
1156920c8300SAndre Guedes 		return err;
115753cce22dSJohan Hedberg 	}
115853cce22dSJohan Hedberg 
1159bc4445c7SAndre Guedes 	add_wait_queue(&hdev->req_wait_q, &wait);
1160bc4445c7SAndre Guedes 	set_current_state(TASK_INTERRUPTIBLE);
1161bc4445c7SAndre Guedes 
11621da177e4SLinus Torvalds 	schedule_timeout(timeout);
11631da177e4SLinus Torvalds 
11641da177e4SLinus Torvalds 	remove_wait_queue(&hdev->req_wait_q, &wait);
11651da177e4SLinus Torvalds 
11661da177e4SLinus Torvalds 	if (signal_pending(current))
11671da177e4SLinus Torvalds 		return -EINTR;
11681da177e4SLinus Torvalds 
11691da177e4SLinus Torvalds 	switch (hdev->req_status) {
11701da177e4SLinus Torvalds 	case HCI_REQ_DONE:
1171e175072fSJoe Perches 		err = -bt_to_errno(hdev->req_result);
11721da177e4SLinus Torvalds 		break;
11731da177e4SLinus Torvalds 
11741da177e4SLinus Torvalds 	case HCI_REQ_CANCELED:
11751da177e4SLinus Torvalds 		err = -hdev->req_result;
11761da177e4SLinus Torvalds 		break;
11771da177e4SLinus Torvalds 
11781da177e4SLinus Torvalds 	default:
11791da177e4SLinus Torvalds 		err = -ETIMEDOUT;
11801da177e4SLinus Torvalds 		break;
11813ff50b79SStephen Hemminger 	}
11821da177e4SLinus Torvalds 
1183a5040efaSJohan Hedberg 	hdev->req_status = hdev->req_result = 0;
11841da177e4SLinus Torvalds 
11851da177e4SLinus Torvalds 	BT_DBG("%s end: err %d", hdev->name, err);
11861da177e4SLinus Torvalds 
11871da177e4SLinus Torvalds 	return err;
11881da177e4SLinus Torvalds }
11891da177e4SLinus Torvalds 
119001178cd4SJohan Hedberg static int hci_req_sync(struct hci_dev *hdev,
119142c6b129SJohan Hedberg 			void (*req)(struct hci_request *req,
119242c6b129SJohan Hedberg 				    unsigned long opt),
11931da177e4SLinus Torvalds 			unsigned long opt, __u32 timeout)
11941da177e4SLinus Torvalds {
11951da177e4SLinus Torvalds 	int ret;
11961da177e4SLinus Torvalds 
11977c6a329eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
11987c6a329eSMarcel Holtmann 		return -ENETDOWN;
11997c6a329eSMarcel Holtmann 
12001da177e4SLinus Torvalds 	/* Serialize all requests */
12011da177e4SLinus Torvalds 	hci_req_lock(hdev);
120201178cd4SJohan Hedberg 	ret = __hci_req_sync(hdev, req, opt, timeout);
12031da177e4SLinus Torvalds 	hci_req_unlock(hdev);
12041da177e4SLinus Torvalds 
12051da177e4SLinus Torvalds 	return ret;
12061da177e4SLinus Torvalds }
12071da177e4SLinus Torvalds 
120842c6b129SJohan Hedberg static void hci_reset_req(struct hci_request *req, unsigned long opt)
12091da177e4SLinus Torvalds {
121042c6b129SJohan Hedberg 	BT_DBG("%s %ld", req->hdev->name, opt);
12111da177e4SLinus Torvalds 
12121da177e4SLinus Torvalds 	/* Reset device */
121342c6b129SJohan Hedberg 	set_bit(HCI_RESET, &req->hdev->flags);
121442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_RESET, 0, NULL);
12151da177e4SLinus Torvalds }
12161da177e4SLinus Torvalds 
121742c6b129SJohan Hedberg static void bredr_init(struct hci_request *req)
12181da177e4SLinus Torvalds {
121942c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED;
12202455a3eaSAndrei Emeltchenko 
12211da177e4SLinus Torvalds 	/* Read Local Supported Features */
122242c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
12231da177e4SLinus Torvalds 
12241143e5a6SMarcel Holtmann 	/* Read Local Version */
122542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
12262177bab5SJohan Hedberg 
12272177bab5SJohan Hedberg 	/* Read BD Address */
122842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
12291da177e4SLinus Torvalds }
12301da177e4SLinus Torvalds 
123142c6b129SJohan Hedberg static void amp_init(struct hci_request *req)
1232e61ef499SAndrei Emeltchenko {
123342c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED;
12342455a3eaSAndrei Emeltchenko 
1235e61ef499SAndrei Emeltchenko 	/* Read Local Version */
123642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
12376bcbc489SAndrei Emeltchenko 
1238f6996cfeSMarcel Holtmann 	/* Read Local Supported Commands */
1239f6996cfeSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
1240f6996cfeSMarcel Holtmann 
1241f6996cfeSMarcel Holtmann 	/* Read Local Supported Features */
1242f6996cfeSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
1243f6996cfeSMarcel Holtmann 
12446bcbc489SAndrei Emeltchenko 	/* Read Local AMP Info */
124542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
1246e71dfabaSAndrei Emeltchenko 
1247e71dfabaSAndrei Emeltchenko 	/* Read Data Blk size */
124842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL);
12497528ca1cSMarcel Holtmann 
1250f38ba941SMarcel Holtmann 	/* Read Flow Control Mode */
1251f38ba941SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_FLOW_CONTROL_MODE, 0, NULL);
1252f38ba941SMarcel Holtmann 
12537528ca1cSMarcel Holtmann 	/* Read Location Data */
12547528ca1cSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCATION_DATA, 0, NULL);
1255e61ef499SAndrei Emeltchenko }
1256e61ef499SAndrei Emeltchenko 
125742c6b129SJohan Hedberg static void hci_init1_req(struct hci_request *req, unsigned long opt)
1258e61ef499SAndrei Emeltchenko {
125942c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
1260e61ef499SAndrei Emeltchenko 
1261e61ef499SAndrei Emeltchenko 	BT_DBG("%s %ld", hdev->name, opt);
1262e61ef499SAndrei Emeltchenko 
126311778716SAndrei Emeltchenko 	/* Reset */
126411778716SAndrei Emeltchenko 	if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
126542c6b129SJohan Hedberg 		hci_reset_req(req, 0);
126611778716SAndrei Emeltchenko 
1267e61ef499SAndrei Emeltchenko 	switch (hdev->dev_type) {
1268e61ef499SAndrei Emeltchenko 	case HCI_BREDR:
126942c6b129SJohan Hedberg 		bredr_init(req);
1270e61ef499SAndrei Emeltchenko 		break;
1271e61ef499SAndrei Emeltchenko 
1272e61ef499SAndrei Emeltchenko 	case HCI_AMP:
127342c6b129SJohan Hedberg 		amp_init(req);
1274e61ef499SAndrei Emeltchenko 		break;
1275e61ef499SAndrei Emeltchenko 
1276e61ef499SAndrei Emeltchenko 	default:
1277e61ef499SAndrei Emeltchenko 		BT_ERR("Unknown device type %d", hdev->dev_type);
1278e61ef499SAndrei Emeltchenko 		break;
1279e61ef499SAndrei Emeltchenko 	}
1280e61ef499SAndrei Emeltchenko }
1281e61ef499SAndrei Emeltchenko 
128242c6b129SJohan Hedberg static void bredr_setup(struct hci_request *req)
12832177bab5SJohan Hedberg {
12844ca048e3SMarcel Holtmann 	struct hci_dev *hdev = req->hdev;
12854ca048e3SMarcel Holtmann 
12862177bab5SJohan Hedberg 	__le16 param;
12872177bab5SJohan Hedberg 	__u8 flt_type;
12882177bab5SJohan Hedberg 
12892177bab5SJohan Hedberg 	/* Read Buffer Size (ACL mtu, max pkt, etc.) */
129042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL);
12912177bab5SJohan Hedberg 
12922177bab5SJohan Hedberg 	/* Read Class of Device */
129342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL);
12942177bab5SJohan Hedberg 
12952177bab5SJohan Hedberg 	/* Read Local Name */
129642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL);
12972177bab5SJohan Hedberg 
12982177bab5SJohan Hedberg 	/* Read Voice Setting */
129942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL);
13002177bab5SJohan Hedberg 
1301b4cb9fb2SMarcel Holtmann 	/* Read Number of Supported IAC */
1302b4cb9fb2SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_NUM_SUPPORTED_IAC, 0, NULL);
1303b4cb9fb2SMarcel Holtmann 
13044b836f39SMarcel Holtmann 	/* Read Current IAC LAP */
13054b836f39SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_CURRENT_IAC_LAP, 0, NULL);
13064b836f39SMarcel Holtmann 
13072177bab5SJohan Hedberg 	/* Clear Event Filters */
13082177bab5SJohan Hedberg 	flt_type = HCI_FLT_CLEAR_ALL;
130942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type);
13102177bab5SJohan Hedberg 
13112177bab5SJohan Hedberg 	/* Connection accept timeout ~20 secs */
1312dcf4adbfSJoe Perches 	param = cpu_to_le16(0x7d00);
131342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, &param);
13142177bab5SJohan Hedberg 
13154ca048e3SMarcel Holtmann 	/* AVM Berlin (31), aka "BlueFRITZ!", reports version 1.2,
13164ca048e3SMarcel Holtmann 	 * but it does not support page scan related HCI commands.
13174ca048e3SMarcel Holtmann 	 */
13184ca048e3SMarcel Holtmann 	if (hdev->manufacturer != 31 && hdev->hci_ver > BLUETOOTH_VER_1_1) {
1319f332ec66SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL);
1320f332ec66SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL);
1321f332ec66SJohan Hedberg 	}
13222177bab5SJohan Hedberg }
13232177bab5SJohan Hedberg 
132442c6b129SJohan Hedberg static void le_setup(struct hci_request *req)
13252177bab5SJohan Hedberg {
1326c73eee91SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
1327c73eee91SJohan Hedberg 
13282177bab5SJohan Hedberg 	/* Read LE Buffer Size */
132942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
13302177bab5SJohan Hedberg 
13312177bab5SJohan Hedberg 	/* Read LE Local Supported Features */
133242c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL);
13332177bab5SJohan Hedberg 
1334747d3f03SMarcel Holtmann 	/* Read LE Supported States */
1335747d3f03SMarcel Holtmann 	hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL);
1336747d3f03SMarcel Holtmann 
13372177bab5SJohan Hedberg 	/* Read LE Advertising Channel TX Power */
133842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL);
13392177bab5SJohan Hedberg 
13402177bab5SJohan Hedberg 	/* Read LE White List Size */
134142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL);
13422177bab5SJohan Hedberg 
1343747d3f03SMarcel Holtmann 	/* Clear LE White List */
1344747d3f03SMarcel Holtmann 	hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL);
1345c73eee91SJohan Hedberg 
1346c73eee91SJohan Hedberg 	/* LE-only controllers have LE implicitly enabled */
1347c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
1348c73eee91SJohan Hedberg 		set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
13492177bab5SJohan Hedberg }
13502177bab5SJohan Hedberg 
13512177bab5SJohan Hedberg static u8 hci_get_inquiry_mode(struct hci_dev *hdev)
13522177bab5SJohan Hedberg {
13532177bab5SJohan Hedberg 	if (lmp_ext_inq_capable(hdev))
13542177bab5SJohan Hedberg 		return 0x02;
13552177bab5SJohan Hedberg 
13562177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
13572177bab5SJohan Hedberg 		return 0x01;
13582177bab5SJohan Hedberg 
13592177bab5SJohan Hedberg 	if (hdev->manufacturer == 11 && hdev->hci_rev == 0x00 &&
13602177bab5SJohan Hedberg 	    hdev->lmp_subver == 0x0757)
13612177bab5SJohan Hedberg 		return 0x01;
13622177bab5SJohan Hedberg 
13632177bab5SJohan Hedberg 	if (hdev->manufacturer == 15) {
13642177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x03 && hdev->lmp_subver == 0x6963)
13652177bab5SJohan Hedberg 			return 0x01;
13662177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x09 && hdev->lmp_subver == 0x6963)
13672177bab5SJohan Hedberg 			return 0x01;
13682177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x00 && hdev->lmp_subver == 0x6965)
13692177bab5SJohan Hedberg 			return 0x01;
13702177bab5SJohan Hedberg 	}
13712177bab5SJohan Hedberg 
13722177bab5SJohan Hedberg 	if (hdev->manufacturer == 31 && hdev->hci_rev == 0x2005 &&
13732177bab5SJohan Hedberg 	    hdev->lmp_subver == 0x1805)
13742177bab5SJohan Hedberg 		return 0x01;
13752177bab5SJohan Hedberg 
13762177bab5SJohan Hedberg 	return 0x00;
13772177bab5SJohan Hedberg }
13782177bab5SJohan Hedberg 
137942c6b129SJohan Hedberg static void hci_setup_inquiry_mode(struct hci_request *req)
13802177bab5SJohan Hedberg {
13812177bab5SJohan Hedberg 	u8 mode;
13822177bab5SJohan Hedberg 
138342c6b129SJohan Hedberg 	mode = hci_get_inquiry_mode(req->hdev);
13842177bab5SJohan Hedberg 
138542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode);
13862177bab5SJohan Hedberg }
13872177bab5SJohan Hedberg 
138842c6b129SJohan Hedberg static void hci_setup_event_mask(struct hci_request *req)
13892177bab5SJohan Hedberg {
139042c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
139142c6b129SJohan Hedberg 
13922177bab5SJohan Hedberg 	/* The second byte is 0xff instead of 0x9f (two reserved bits
13932177bab5SJohan Hedberg 	 * disabled) since a Broadcom 1.2 dongle doesn't respond to the
13942177bab5SJohan Hedberg 	 * command otherwise.
13952177bab5SJohan Hedberg 	 */
13962177bab5SJohan Hedberg 	u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 };
13972177bab5SJohan Hedberg 
13982177bab5SJohan Hedberg 	/* CSR 1.1 dongles does not accept any bitfield so don't try to set
13992177bab5SJohan Hedberg 	 * any event mask for pre 1.2 devices.
14002177bab5SJohan Hedberg 	 */
14012177bab5SJohan Hedberg 	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
14022177bab5SJohan Hedberg 		return;
14032177bab5SJohan Hedberg 
14042177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
14052177bab5SJohan Hedberg 		events[4] |= 0x01; /* Flow Specification Complete */
14062177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
14072177bab5SJohan Hedberg 		events[4] |= 0x04; /* Read Remote Extended Features Complete */
14082177bab5SJohan Hedberg 		events[5] |= 0x08; /* Synchronous Connection Complete */
14092177bab5SJohan Hedberg 		events[5] |= 0x10; /* Synchronous Connection Changed */
1410c7882cbdSMarcel Holtmann 	} else {
1411c7882cbdSMarcel Holtmann 		/* Use a different default for LE-only devices */
1412c7882cbdSMarcel Holtmann 		memset(events, 0, sizeof(events));
1413c7882cbdSMarcel Holtmann 		events[0] |= 0x10; /* Disconnection Complete */
1414c7882cbdSMarcel Holtmann 		events[0] |= 0x80; /* Encryption Change */
1415c7882cbdSMarcel Holtmann 		events[1] |= 0x08; /* Read Remote Version Information Complete */
1416c7882cbdSMarcel Holtmann 		events[1] |= 0x20; /* Command Complete */
1417c7882cbdSMarcel Holtmann 		events[1] |= 0x40; /* Command Status */
1418c7882cbdSMarcel Holtmann 		events[1] |= 0x80; /* Hardware Error */
1419c7882cbdSMarcel Holtmann 		events[2] |= 0x04; /* Number of Completed Packets */
1420c7882cbdSMarcel Holtmann 		events[3] |= 0x02; /* Data Buffer Overflow */
1421c7882cbdSMarcel Holtmann 		events[5] |= 0x80; /* Encryption Key Refresh Complete */
14222177bab5SJohan Hedberg 	}
14232177bab5SJohan Hedberg 
14242177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
14252177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
14262177bab5SJohan Hedberg 
14272177bab5SJohan Hedberg 	if (lmp_sniffsubr_capable(hdev))
14282177bab5SJohan Hedberg 		events[5] |= 0x20; /* Sniff Subrating */
14292177bab5SJohan Hedberg 
14302177bab5SJohan Hedberg 	if (lmp_pause_enc_capable(hdev))
14312177bab5SJohan Hedberg 		events[5] |= 0x80; /* Encryption Key Refresh Complete */
14322177bab5SJohan Hedberg 
14332177bab5SJohan Hedberg 	if (lmp_ext_inq_capable(hdev))
14342177bab5SJohan Hedberg 		events[5] |= 0x40; /* Extended Inquiry Result */
14352177bab5SJohan Hedberg 
14362177bab5SJohan Hedberg 	if (lmp_no_flush_capable(hdev))
14372177bab5SJohan Hedberg 		events[7] |= 0x01; /* Enhanced Flush Complete */
14382177bab5SJohan Hedberg 
14392177bab5SJohan Hedberg 	if (lmp_lsto_capable(hdev))
14402177bab5SJohan Hedberg 		events[6] |= 0x80; /* Link Supervision Timeout Changed */
14412177bab5SJohan Hedberg 
14422177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
14432177bab5SJohan Hedberg 		events[6] |= 0x01;	/* IO Capability Request */
14442177bab5SJohan Hedberg 		events[6] |= 0x02;	/* IO Capability Response */
14452177bab5SJohan Hedberg 		events[6] |= 0x04;	/* User Confirmation Request */
14462177bab5SJohan Hedberg 		events[6] |= 0x08;	/* User Passkey Request */
14472177bab5SJohan Hedberg 		events[6] |= 0x10;	/* Remote OOB Data Request */
14482177bab5SJohan Hedberg 		events[6] |= 0x20;	/* Simple Pairing Complete */
14492177bab5SJohan Hedberg 		events[7] |= 0x04;	/* User Passkey Notification */
14502177bab5SJohan Hedberg 		events[7] |= 0x08;	/* Keypress Notification */
14512177bab5SJohan Hedberg 		events[7] |= 0x10;	/* Remote Host Supported
14522177bab5SJohan Hedberg 					 * Features Notification
14532177bab5SJohan Hedberg 					 */
14542177bab5SJohan Hedberg 	}
14552177bab5SJohan Hedberg 
14562177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
14572177bab5SJohan Hedberg 		events[7] |= 0x20;	/* LE Meta-Event */
14582177bab5SJohan Hedberg 
145942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events);
14602177bab5SJohan Hedberg 
14612177bab5SJohan Hedberg 	if (lmp_le_capable(hdev)) {
14622177bab5SJohan Hedberg 		memset(events, 0, sizeof(events));
14632177bab5SJohan Hedberg 		events[0] = 0x1f;
146442c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK,
14652177bab5SJohan Hedberg 			    sizeof(events), events);
14662177bab5SJohan Hedberg 	}
14672177bab5SJohan Hedberg }
14682177bab5SJohan Hedberg 
146942c6b129SJohan Hedberg static void hci_init2_req(struct hci_request *req, unsigned long opt)
14702177bab5SJohan Hedberg {
147142c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
147242c6b129SJohan Hedberg 
14732177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev))
147442c6b129SJohan Hedberg 		bredr_setup(req);
147556f87901SJohan Hedberg 	else
147656f87901SJohan Hedberg 		clear_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
14772177bab5SJohan Hedberg 
14782177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
147942c6b129SJohan Hedberg 		le_setup(req);
14802177bab5SJohan Hedberg 
148142c6b129SJohan Hedberg 	hci_setup_event_mask(req);
14822177bab5SJohan Hedberg 
14833f8e2d75SJohan Hedberg 	/* AVM Berlin (31), aka "BlueFRITZ!", doesn't support the read
14843f8e2d75SJohan Hedberg 	 * local supported commands HCI command.
14853f8e2d75SJohan Hedberg 	 */
14863f8e2d75SJohan Hedberg 	if (hdev->manufacturer != 31 && hdev->hci_ver > BLUETOOTH_VER_1_1)
148742c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
14882177bab5SJohan Hedberg 
14892177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
149057af75a8SMarcel Holtmann 		/* When SSP is available, then the host features page
149157af75a8SMarcel Holtmann 		 * should also be available as well. However some
149257af75a8SMarcel Holtmann 		 * controllers list the max_page as 0 as long as SSP
149357af75a8SMarcel Holtmann 		 * has not been enabled. To achieve proper debugging
149457af75a8SMarcel Holtmann 		 * output, force the minimum max_page to 1 at least.
149557af75a8SMarcel Holtmann 		 */
149657af75a8SMarcel Holtmann 		hdev->max_page = 0x01;
149757af75a8SMarcel Holtmann 
14982177bab5SJohan Hedberg 		if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
14992177bab5SJohan Hedberg 			u8 mode = 0x01;
150042c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_SSP_MODE,
15012177bab5SJohan Hedberg 				    sizeof(mode), &mode);
15022177bab5SJohan Hedberg 		} else {
15032177bab5SJohan Hedberg 			struct hci_cp_write_eir cp;
15042177bab5SJohan Hedberg 
15052177bab5SJohan Hedberg 			memset(hdev->eir, 0, sizeof(hdev->eir));
15062177bab5SJohan Hedberg 			memset(&cp, 0, sizeof(cp));
15072177bab5SJohan Hedberg 
150842c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
15092177bab5SJohan Hedberg 		}
15102177bab5SJohan Hedberg 	}
15112177bab5SJohan Hedberg 
15122177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
151342c6b129SJohan Hedberg 		hci_setup_inquiry_mode(req);
15142177bab5SJohan Hedberg 
15152177bab5SJohan Hedberg 	if (lmp_inq_tx_pwr_capable(hdev))
151642c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL);
15172177bab5SJohan Hedberg 
15182177bab5SJohan Hedberg 	if (lmp_ext_feat_capable(hdev)) {
15192177bab5SJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
15202177bab5SJohan Hedberg 
15212177bab5SJohan Hedberg 		cp.page = 0x01;
152242c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
152342c6b129SJohan Hedberg 			    sizeof(cp), &cp);
15242177bab5SJohan Hedberg 	}
15252177bab5SJohan Hedberg 
15262177bab5SJohan Hedberg 	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags)) {
15272177bab5SJohan Hedberg 		u8 enable = 1;
152842c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable),
15292177bab5SJohan Hedberg 			    &enable);
15302177bab5SJohan Hedberg 	}
15312177bab5SJohan Hedberg }
15322177bab5SJohan Hedberg 
153342c6b129SJohan Hedberg static void hci_setup_link_policy(struct hci_request *req)
15342177bab5SJohan Hedberg {
153542c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
15362177bab5SJohan Hedberg 	struct hci_cp_write_def_link_policy cp;
15372177bab5SJohan Hedberg 	u16 link_policy = 0;
15382177bab5SJohan Hedberg 
15392177bab5SJohan Hedberg 	if (lmp_rswitch_capable(hdev))
15402177bab5SJohan Hedberg 		link_policy |= HCI_LP_RSWITCH;
15412177bab5SJohan Hedberg 	if (lmp_hold_capable(hdev))
15422177bab5SJohan Hedberg 		link_policy |= HCI_LP_HOLD;
15432177bab5SJohan Hedberg 	if (lmp_sniff_capable(hdev))
15442177bab5SJohan Hedberg 		link_policy |= HCI_LP_SNIFF;
15452177bab5SJohan Hedberg 	if (lmp_park_capable(hdev))
15462177bab5SJohan Hedberg 		link_policy |= HCI_LP_PARK;
15472177bab5SJohan Hedberg 
15482177bab5SJohan Hedberg 	cp.policy = cpu_to_le16(link_policy);
154942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp);
15502177bab5SJohan Hedberg }
15512177bab5SJohan Hedberg 
155242c6b129SJohan Hedberg static void hci_set_le_support(struct hci_request *req)
15532177bab5SJohan Hedberg {
155442c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
15552177bab5SJohan Hedberg 	struct hci_cp_write_le_host_supported cp;
15562177bab5SJohan Hedberg 
1557c73eee91SJohan Hedberg 	/* LE-only devices do not support explicit enablement */
1558c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
1559c73eee91SJohan Hedberg 		return;
1560c73eee91SJohan Hedberg 
15612177bab5SJohan Hedberg 	memset(&cp, 0, sizeof(cp));
15622177bab5SJohan Hedberg 
15632177bab5SJohan Hedberg 	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
15642177bab5SJohan Hedberg 		cp.le = 0x01;
15652177bab5SJohan Hedberg 		cp.simul = lmp_le_br_capable(hdev);
15662177bab5SJohan Hedberg 	}
15672177bab5SJohan Hedberg 
15682177bab5SJohan Hedberg 	if (cp.le != lmp_host_le_capable(hdev))
156942c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp),
15702177bab5SJohan Hedberg 			    &cp);
15712177bab5SJohan Hedberg }
15722177bab5SJohan Hedberg 
1573d62e6d67SJohan Hedberg static void hci_set_event_mask_page_2(struct hci_request *req)
1574d62e6d67SJohan Hedberg {
1575d62e6d67SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
1576d62e6d67SJohan Hedberg 	u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1577d62e6d67SJohan Hedberg 
1578d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast master role is supported
1579d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
1580d62e6d67SJohan Hedberg 	 */
158153b834d2SMarcel Holtmann 	if (lmp_csb_master_capable(hdev)) {
1582d62e6d67SJohan Hedberg 		events[1] |= 0x40;	/* Triggered Clock Capture */
1583d62e6d67SJohan Hedberg 		events[1] |= 0x80;	/* Synchronization Train Complete */
1584d62e6d67SJohan Hedberg 		events[2] |= 0x10;	/* Slave Page Response Timeout */
1585d62e6d67SJohan Hedberg 		events[2] |= 0x20;	/* CSB Channel Map Change */
1586d62e6d67SJohan Hedberg 	}
1587d62e6d67SJohan Hedberg 
1588d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast slave role is supported
1589d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
1590d62e6d67SJohan Hedberg 	 */
159153b834d2SMarcel Holtmann 	if (lmp_csb_slave_capable(hdev)) {
1592d62e6d67SJohan Hedberg 		events[2] |= 0x01;	/* Synchronization Train Received */
1593d62e6d67SJohan Hedberg 		events[2] |= 0x02;	/* CSB Receive */
1594d62e6d67SJohan Hedberg 		events[2] |= 0x04;	/* CSB Timeout */
1595d62e6d67SJohan Hedberg 		events[2] |= 0x08;	/* Truncated Page Complete */
1596d62e6d67SJohan Hedberg 	}
1597d62e6d67SJohan Hedberg 
159840c59fcbSMarcel Holtmann 	/* Enable Authenticated Payload Timeout Expired event if supported */
159940c59fcbSMarcel Holtmann 	if (lmp_ping_capable(hdev))
160040c59fcbSMarcel Holtmann 		events[2] |= 0x80;
160140c59fcbSMarcel Holtmann 
1602d62e6d67SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2, sizeof(events), events);
1603d62e6d67SJohan Hedberg }
1604d62e6d67SJohan Hedberg 
160542c6b129SJohan Hedberg static void hci_init3_req(struct hci_request *req, unsigned long opt)
16062177bab5SJohan Hedberg {
160742c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
1608d2c5d77fSJohan Hedberg 	u8 p;
160942c6b129SJohan Hedberg 
1610b8f4e068SGustavo Padovan 	/* Some Broadcom based Bluetooth controllers do not support the
1611b8f4e068SGustavo Padovan 	 * Delete Stored Link Key command. They are clearly indicating its
1612b8f4e068SGustavo Padovan 	 * absence in the bit mask of supported commands.
1613b8f4e068SGustavo Padovan 	 *
1614b8f4e068SGustavo Padovan 	 * Check the supported commands and only if the the command is marked
1615b8f4e068SGustavo Padovan 	 * as supported send it. If not supported assume that the controller
1616b8f4e068SGustavo Padovan 	 * does not have actual support for stored link keys which makes this
1617b8f4e068SGustavo Padovan 	 * command redundant anyway.
1618f9f462faSMarcel Holtmann 	 *
1619f9f462faSMarcel Holtmann 	 * Some controllers indicate that they support handling deleting
1620f9f462faSMarcel Holtmann 	 * stored link keys, but they don't. The quirk lets a driver
1621f9f462faSMarcel Holtmann 	 * just disable this command.
1622b8f4e068SGustavo Padovan 	 */
1623f9f462faSMarcel Holtmann 	if (hdev->commands[6] & 0x80 &&
1624f9f462faSMarcel Holtmann 	    !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) {
162559f45d57SJohan Hedberg 		struct hci_cp_delete_stored_link_key cp;
162659f45d57SJohan Hedberg 
162759f45d57SJohan Hedberg 		bacpy(&cp.bdaddr, BDADDR_ANY);
162859f45d57SJohan Hedberg 		cp.delete_all = 0x01;
162959f45d57SJohan Hedberg 		hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY,
163059f45d57SJohan Hedberg 			    sizeof(cp), &cp);
163159f45d57SJohan Hedberg 	}
163259f45d57SJohan Hedberg 
16332177bab5SJohan Hedberg 	if (hdev->commands[5] & 0x10)
163442c6b129SJohan Hedberg 		hci_setup_link_policy(req);
16352177bab5SJohan Hedberg 
16367bf32048SJohan Hedberg 	if (lmp_le_capable(hdev))
163742c6b129SJohan Hedberg 		hci_set_le_support(req);
1638d2c5d77fSJohan Hedberg 
1639d2c5d77fSJohan Hedberg 	/* Read features beyond page 1 if available */
1640d2c5d77fSJohan Hedberg 	for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
1641d2c5d77fSJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
1642d2c5d77fSJohan Hedberg 
1643d2c5d77fSJohan Hedberg 		cp.page = p;
1644d2c5d77fSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
1645d2c5d77fSJohan Hedberg 			    sizeof(cp), &cp);
1646d2c5d77fSJohan Hedberg 	}
16472177bab5SJohan Hedberg }
16482177bab5SJohan Hedberg 
16495d4e7e8dSJohan Hedberg static void hci_init4_req(struct hci_request *req, unsigned long opt)
16505d4e7e8dSJohan Hedberg {
16515d4e7e8dSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
16525d4e7e8dSJohan Hedberg 
1653d62e6d67SJohan Hedberg 	/* Set event mask page 2 if the HCI command for it is supported */
1654d62e6d67SJohan Hedberg 	if (hdev->commands[22] & 0x04)
1655d62e6d67SJohan Hedberg 		hci_set_event_mask_page_2(req);
1656d62e6d67SJohan Hedberg 
16575d4e7e8dSJohan Hedberg 	/* Check for Synchronization Train support */
165853b834d2SMarcel Holtmann 	if (lmp_sync_train_capable(hdev))
16595d4e7e8dSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL);
1660a6d0d690SMarcel Holtmann 
1661a6d0d690SMarcel Holtmann 	/* Enable Secure Connections if supported and configured */
16625afeac14SMarcel Holtmann 	if ((lmp_sc_capable(hdev) ||
1663111902f7SMarcel Holtmann 	     test_bit(HCI_FORCE_SC, &hdev->dbg_flags)) &&
1664a6d0d690SMarcel Holtmann 	    test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
1665a6d0d690SMarcel Holtmann 		u8 support = 0x01;
1666a6d0d690SMarcel Holtmann 		hci_req_add(req, HCI_OP_WRITE_SC_SUPPORT,
1667a6d0d690SMarcel Holtmann 			    sizeof(support), &support);
1668a6d0d690SMarcel Holtmann 	}
16695d4e7e8dSJohan Hedberg }
16705d4e7e8dSJohan Hedberg 
16712177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev)
16722177bab5SJohan Hedberg {
16732177bab5SJohan Hedberg 	int err;
16742177bab5SJohan Hedberg 
16752177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT);
16762177bab5SJohan Hedberg 	if (err < 0)
16772177bab5SJohan Hedberg 		return err;
16782177bab5SJohan Hedberg 
16794b4148e9SMarcel Holtmann 	/* The Device Under Test (DUT) mode is special and available for
16804b4148e9SMarcel Holtmann 	 * all controller types. So just create it early on.
16814b4148e9SMarcel Holtmann 	 */
16824b4148e9SMarcel Holtmann 	if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
16834b4148e9SMarcel Holtmann 		debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev,
16844b4148e9SMarcel Holtmann 				    &dut_mode_fops);
16854b4148e9SMarcel Holtmann 	}
16864b4148e9SMarcel Holtmann 
16872177bab5SJohan Hedberg 	/* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode
16882177bab5SJohan Hedberg 	 * BR/EDR/LE type controllers. AMP controllers only need the
16892177bab5SJohan Hedberg 	 * first stage init.
16902177bab5SJohan Hedberg 	 */
16912177bab5SJohan Hedberg 	if (hdev->dev_type != HCI_BREDR)
16922177bab5SJohan Hedberg 		return 0;
16932177bab5SJohan Hedberg 
16942177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT);
16952177bab5SJohan Hedberg 	if (err < 0)
16962177bab5SJohan Hedberg 		return err;
16972177bab5SJohan Hedberg 
16985d4e7e8dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT);
16995d4e7e8dSJohan Hedberg 	if (err < 0)
17005d4e7e8dSJohan Hedberg 		return err;
17015d4e7e8dSJohan Hedberg 
1702baf27f6eSMarcel Holtmann 	err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT);
1703baf27f6eSMarcel Holtmann 	if (err < 0)
1704baf27f6eSMarcel Holtmann 		return err;
1705baf27f6eSMarcel Holtmann 
1706baf27f6eSMarcel Holtmann 	/* Only create debugfs entries during the initial setup
1707baf27f6eSMarcel Holtmann 	 * phase and not every time the controller gets powered on.
1708baf27f6eSMarcel Holtmann 	 */
1709baf27f6eSMarcel Holtmann 	if (!test_bit(HCI_SETUP, &hdev->dev_flags))
1710baf27f6eSMarcel Holtmann 		return 0;
1711baf27f6eSMarcel Holtmann 
1712dfb826a8SMarcel Holtmann 	debugfs_create_file("features", 0444, hdev->debugfs, hdev,
1713dfb826a8SMarcel Holtmann 			    &features_fops);
1714ceeb3bc0SMarcel Holtmann 	debugfs_create_u16("manufacturer", 0444, hdev->debugfs,
1715ceeb3bc0SMarcel Holtmann 			   &hdev->manufacturer);
1716ceeb3bc0SMarcel Holtmann 	debugfs_create_u8("hci_version", 0444, hdev->debugfs, &hdev->hci_ver);
1717ceeb3bc0SMarcel Holtmann 	debugfs_create_u16("hci_revision", 0444, hdev->debugfs, &hdev->hci_rev);
171870afe0b8SMarcel Holtmann 	debugfs_create_file("blacklist", 0444, hdev->debugfs, hdev,
171970afe0b8SMarcel Holtmann 			    &blacklist_fops);
172047219839SMarcel Holtmann 	debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
172147219839SMarcel Holtmann 
172231ad1691SAndrzej Kaczmarek 	debugfs_create_file("conn_info_min_age", 0644, hdev->debugfs, hdev,
172331ad1691SAndrzej Kaczmarek 			    &conn_info_min_age_fops);
172431ad1691SAndrzej Kaczmarek 	debugfs_create_file("conn_info_max_age", 0644, hdev->debugfs, hdev,
172531ad1691SAndrzej Kaczmarek 			    &conn_info_max_age_fops);
172631ad1691SAndrzej Kaczmarek 
1727baf27f6eSMarcel Holtmann 	if (lmp_bredr_capable(hdev)) {
1728baf27f6eSMarcel Holtmann 		debugfs_create_file("inquiry_cache", 0444, hdev->debugfs,
1729baf27f6eSMarcel Holtmann 				    hdev, &inquiry_cache_fops);
173002d08d15SMarcel Holtmann 		debugfs_create_file("link_keys", 0400, hdev->debugfs,
173102d08d15SMarcel Holtmann 				    hdev, &link_keys_fops);
1732babdbb3cSMarcel Holtmann 		debugfs_create_file("dev_class", 0444, hdev->debugfs,
1733babdbb3cSMarcel Holtmann 				    hdev, &dev_class_fops);
1734041000b9SMarcel Holtmann 		debugfs_create_file("voice_setting", 0444, hdev->debugfs,
1735041000b9SMarcel Holtmann 				    hdev, &voice_setting_fops);
1736baf27f6eSMarcel Holtmann 	}
1737baf27f6eSMarcel Holtmann 
173806f5b778SMarcel Holtmann 	if (lmp_ssp_capable(hdev)) {
1739ebd1e33bSMarcel Holtmann 		debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs,
1740ebd1e33bSMarcel Holtmann 				    hdev, &auto_accept_delay_fops);
17415afeac14SMarcel Holtmann 		debugfs_create_file("force_sc_support", 0644, hdev->debugfs,
17425afeac14SMarcel Holtmann 				    hdev, &force_sc_support_fops);
1743134c2a89SMarcel Holtmann 		debugfs_create_file("sc_only_mode", 0444, hdev->debugfs,
1744134c2a89SMarcel Holtmann 				    hdev, &sc_only_mode_fops);
174506f5b778SMarcel Holtmann 	}
1746ebd1e33bSMarcel Holtmann 
17472bfa3531SMarcel Holtmann 	if (lmp_sniff_capable(hdev)) {
17482bfa3531SMarcel Holtmann 		debugfs_create_file("idle_timeout", 0644, hdev->debugfs,
17492bfa3531SMarcel Holtmann 				    hdev, &idle_timeout_fops);
17502bfa3531SMarcel Holtmann 		debugfs_create_file("sniff_min_interval", 0644, hdev->debugfs,
17512bfa3531SMarcel Holtmann 				    hdev, &sniff_min_interval_fops);
17522bfa3531SMarcel Holtmann 		debugfs_create_file("sniff_max_interval", 0644, hdev->debugfs,
17532bfa3531SMarcel Holtmann 				    hdev, &sniff_max_interval_fops);
17542bfa3531SMarcel Holtmann 	}
17552bfa3531SMarcel Holtmann 
1756d0f729b8SMarcel Holtmann 	if (lmp_le_capable(hdev)) {
1757ac345813SMarcel Holtmann 		debugfs_create_file("identity", 0400, hdev->debugfs,
1758ac345813SMarcel Holtmann 				    hdev, &identity_fops);
1759ac345813SMarcel Holtmann 		debugfs_create_file("rpa_timeout", 0644, hdev->debugfs,
1760ac345813SMarcel Holtmann 				    hdev, &rpa_timeout_fops);
17617a4cd51dSMarcel Holtmann 		debugfs_create_file("random_address", 0444, hdev->debugfs,
17627a4cd51dSMarcel Holtmann 				    hdev, &random_address_fops);
1763e7b8fc92SMarcel Holtmann 		debugfs_create_file("static_address", 0444, hdev->debugfs,
1764e7b8fc92SMarcel Holtmann 				    hdev, &static_address_fops);
1765b32bba6cSMarcel Holtmann 
1766b32bba6cSMarcel Holtmann 		/* For controllers with a public address, provide a debug
1767b32bba6cSMarcel Holtmann 		 * option to force the usage of the configured static
1768b32bba6cSMarcel Holtmann 		 * address. By default the public address is used.
1769b32bba6cSMarcel Holtmann 		 */
1770b32bba6cSMarcel Holtmann 		if (bacmp(&hdev->bdaddr, BDADDR_ANY))
1771b32bba6cSMarcel Holtmann 			debugfs_create_file("force_static_address", 0644,
1772b32bba6cSMarcel Holtmann 					    hdev->debugfs, hdev,
1773b32bba6cSMarcel Holtmann 					    &force_static_address_fops);
1774b32bba6cSMarcel Holtmann 
1775b32bba6cSMarcel Holtmann 		debugfs_create_u8("white_list_size", 0444, hdev->debugfs,
1776b32bba6cSMarcel Holtmann 				  &hdev->le_white_list_size);
1777d2ab0ac1SMarcel Holtmann 		debugfs_create_file("white_list", 0444, hdev->debugfs, hdev,
1778d2ab0ac1SMarcel Holtmann 				    &white_list_fops);
17793698d704SMarcel Holtmann 		debugfs_create_file("identity_resolving_keys", 0400,
17803698d704SMarcel Holtmann 				    hdev->debugfs, hdev,
17813698d704SMarcel Holtmann 				    &identity_resolving_keys_fops);
17828f8625cdSMarcel Holtmann 		debugfs_create_file("long_term_keys", 0400, hdev->debugfs,
17838f8625cdSMarcel Holtmann 				    hdev, &long_term_keys_fops);
17844e70c7e7SMarcel Holtmann 		debugfs_create_file("conn_min_interval", 0644, hdev->debugfs,
17854e70c7e7SMarcel Holtmann 				    hdev, &conn_min_interval_fops);
17864e70c7e7SMarcel Holtmann 		debugfs_create_file("conn_max_interval", 0644, hdev->debugfs,
17874e70c7e7SMarcel Holtmann 				    hdev, &conn_max_interval_fops);
17883f959d46SMarcel Holtmann 		debugfs_create_file("adv_channel_map", 0644, hdev->debugfs,
17893f959d46SMarcel Holtmann 				    hdev, &adv_channel_map_fops);
17907d474e06SAndre Guedes 		debugfs_create_file("le_auto_conn", 0644, hdev->debugfs, hdev,
17917d474e06SAndre Guedes 				    &le_auto_conn_fops);
1792b9a7a61eSLukasz Rymanowski 		debugfs_create_u16("discov_interleaved_timeout", 0644,
1793b9a7a61eSLukasz Rymanowski 				   hdev->debugfs,
1794b9a7a61eSLukasz Rymanowski 				   &hdev->discov_interleaved_timeout);
1795d0f729b8SMarcel Holtmann 	}
1796e7b8fc92SMarcel Holtmann 
1797baf27f6eSMarcel Holtmann 	return 0;
17982177bab5SJohan Hedberg }
17992177bab5SJohan Hedberg 
180042c6b129SJohan Hedberg static void hci_scan_req(struct hci_request *req, unsigned long opt)
18011da177e4SLinus Torvalds {
18021da177e4SLinus Torvalds 	__u8 scan = opt;
18031da177e4SLinus Torvalds 
180442c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, scan);
18051da177e4SLinus Torvalds 
18061da177e4SLinus Torvalds 	/* Inquiry and Page scans */
180742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
18081da177e4SLinus Torvalds }
18091da177e4SLinus Torvalds 
181042c6b129SJohan Hedberg static void hci_auth_req(struct hci_request *req, unsigned long opt)
18111da177e4SLinus Torvalds {
18121da177e4SLinus Torvalds 	__u8 auth = opt;
18131da177e4SLinus Torvalds 
181442c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, auth);
18151da177e4SLinus Torvalds 
18161da177e4SLinus Torvalds 	/* Authentication */
181742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
18181da177e4SLinus Torvalds }
18191da177e4SLinus Torvalds 
182042c6b129SJohan Hedberg static void hci_encrypt_req(struct hci_request *req, unsigned long opt)
18211da177e4SLinus Torvalds {
18221da177e4SLinus Torvalds 	__u8 encrypt = opt;
18231da177e4SLinus Torvalds 
182442c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, encrypt);
18251da177e4SLinus Torvalds 
1826e4e8e37cSMarcel Holtmann 	/* Encryption */
182742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
18281da177e4SLinus Torvalds }
18291da177e4SLinus Torvalds 
183042c6b129SJohan Hedberg static void hci_linkpol_req(struct hci_request *req, unsigned long opt)
1831e4e8e37cSMarcel Holtmann {
1832e4e8e37cSMarcel Holtmann 	__le16 policy = cpu_to_le16(opt);
1833e4e8e37cSMarcel Holtmann 
183442c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, policy);
1835e4e8e37cSMarcel Holtmann 
1836e4e8e37cSMarcel Holtmann 	/* Default link policy */
183742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
1838e4e8e37cSMarcel Holtmann }
1839e4e8e37cSMarcel Holtmann 
18401da177e4SLinus Torvalds /* Get HCI device by index.
18411da177e4SLinus Torvalds  * Device is held on return. */
18421da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index)
18431da177e4SLinus Torvalds {
18448035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev = NULL, *d;
18451da177e4SLinus Torvalds 
18461da177e4SLinus Torvalds 	BT_DBG("%d", index);
18471da177e4SLinus Torvalds 
18481da177e4SLinus Torvalds 	if (index < 0)
18491da177e4SLinus Torvalds 		return NULL;
18501da177e4SLinus Torvalds 
18511da177e4SLinus Torvalds 	read_lock(&hci_dev_list_lock);
18528035ded4SLuiz Augusto von Dentz 	list_for_each_entry(d, &hci_dev_list, list) {
18531da177e4SLinus Torvalds 		if (d->id == index) {
18541da177e4SLinus Torvalds 			hdev = hci_dev_hold(d);
18551da177e4SLinus Torvalds 			break;
18561da177e4SLinus Torvalds 		}
18571da177e4SLinus Torvalds 	}
18581da177e4SLinus Torvalds 	read_unlock(&hci_dev_list_lock);
18591da177e4SLinus Torvalds 	return hdev;
18601da177e4SLinus Torvalds }
18611da177e4SLinus Torvalds 
18621da177e4SLinus Torvalds /* ---- Inquiry support ---- */
1863ff9ef578SJohan Hedberg 
186430dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev)
186530dc78e1SJohan Hedberg {
186630dc78e1SJohan Hedberg 	struct discovery_state *discov = &hdev->discovery;
186730dc78e1SJohan Hedberg 
18686fbe195dSAndre Guedes 	switch (discov->state) {
1869343f935bSAndre Guedes 	case DISCOVERY_FINDING:
18706fbe195dSAndre Guedes 	case DISCOVERY_RESOLVING:
187130dc78e1SJohan Hedberg 		return true;
187230dc78e1SJohan Hedberg 
18736fbe195dSAndre Guedes 	default:
187430dc78e1SJohan Hedberg 		return false;
187530dc78e1SJohan Hedberg 	}
18766fbe195dSAndre Guedes }
187730dc78e1SJohan Hedberg 
1878ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state)
1879ff9ef578SJohan Hedberg {
1880ff9ef578SJohan Hedberg 	BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state);
1881ff9ef578SJohan Hedberg 
1882ff9ef578SJohan Hedberg 	if (hdev->discovery.state == state)
1883ff9ef578SJohan Hedberg 		return;
1884ff9ef578SJohan Hedberg 
1885ff9ef578SJohan Hedberg 	switch (state) {
1886ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPED:
1887c54c3860SAndre Guedes 		hci_update_background_scan(hdev);
1888c54c3860SAndre Guedes 
18897b99b659SAndre Guedes 		if (hdev->discovery.state != DISCOVERY_STARTING)
1890ff9ef578SJohan Hedberg 			mgmt_discovering(hdev, 0);
1891ff9ef578SJohan Hedberg 		break;
1892ff9ef578SJohan Hedberg 	case DISCOVERY_STARTING:
1893ff9ef578SJohan Hedberg 		break;
1894343f935bSAndre Guedes 	case DISCOVERY_FINDING:
1895ff9ef578SJohan Hedberg 		mgmt_discovering(hdev, 1);
1896ff9ef578SJohan Hedberg 		break;
189730dc78e1SJohan Hedberg 	case DISCOVERY_RESOLVING:
189830dc78e1SJohan Hedberg 		break;
1899ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPING:
1900ff9ef578SJohan Hedberg 		break;
1901ff9ef578SJohan Hedberg 	}
1902ff9ef578SJohan Hedberg 
1903ff9ef578SJohan Hedberg 	hdev->discovery.state = state;
1904ff9ef578SJohan Hedberg }
1905ff9ef578SJohan Hedberg 
19061f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev)
19071da177e4SLinus Torvalds {
190830883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1909b57c1a56SJohan Hedberg 	struct inquiry_entry *p, *n;
19101da177e4SLinus Torvalds 
1911561aafbcSJohan Hedberg 	list_for_each_entry_safe(p, n, &cache->all, all) {
1912561aafbcSJohan Hedberg 		list_del(&p->all);
1913b57c1a56SJohan Hedberg 		kfree(p);
19141da177e4SLinus Torvalds 	}
1915561aafbcSJohan Hedberg 
1916561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->unknown);
1917561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->resolve);
19181da177e4SLinus Torvalds }
19191da177e4SLinus Torvalds 
1920a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
1921a8c5fb1aSGustavo Padovan 					       bdaddr_t *bdaddr)
19221da177e4SLinus Torvalds {
192330883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
19241da177e4SLinus Torvalds 	struct inquiry_entry *e;
19251da177e4SLinus Torvalds 
19266ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
19271da177e4SLinus Torvalds 
1928561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
19291da177e4SLinus Torvalds 		if (!bacmp(&e->data.bdaddr, bdaddr))
19301da177e4SLinus Torvalds 			return e;
19311da177e4SLinus Torvalds 	}
19321da177e4SLinus Torvalds 
1933b57c1a56SJohan Hedberg 	return NULL;
1934b57c1a56SJohan Hedberg }
1935b57c1a56SJohan Hedberg 
1936561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
1937561aafbcSJohan Hedberg 						       bdaddr_t *bdaddr)
1938561aafbcSJohan Hedberg {
193930883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1940561aafbcSJohan Hedberg 	struct inquiry_entry *e;
1941561aafbcSJohan Hedberg 
19426ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
1943561aafbcSJohan Hedberg 
1944561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->unknown, list) {
1945561aafbcSJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
1946561aafbcSJohan Hedberg 			return e;
1947561aafbcSJohan Hedberg 	}
1948561aafbcSJohan Hedberg 
1949561aafbcSJohan Hedberg 	return NULL;
1950561aafbcSJohan Hedberg }
1951561aafbcSJohan Hedberg 
195230dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
195330dc78e1SJohan Hedberg 						       bdaddr_t *bdaddr,
195430dc78e1SJohan Hedberg 						       int state)
195530dc78e1SJohan Hedberg {
195630dc78e1SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
195730dc78e1SJohan Hedberg 	struct inquiry_entry *e;
195830dc78e1SJohan Hedberg 
19596ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state);
196030dc78e1SJohan Hedberg 
196130dc78e1SJohan Hedberg 	list_for_each_entry(e, &cache->resolve, list) {
196230dc78e1SJohan Hedberg 		if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state)
196330dc78e1SJohan Hedberg 			return e;
196430dc78e1SJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
196530dc78e1SJohan Hedberg 			return e;
196630dc78e1SJohan Hedberg 	}
196730dc78e1SJohan Hedberg 
196830dc78e1SJohan Hedberg 	return NULL;
196930dc78e1SJohan Hedberg }
197030dc78e1SJohan Hedberg 
1971a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
1972a3d4e20aSJohan Hedberg 				      struct inquiry_entry *ie)
1973a3d4e20aSJohan Hedberg {
1974a3d4e20aSJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1975a3d4e20aSJohan Hedberg 	struct list_head *pos = &cache->resolve;
1976a3d4e20aSJohan Hedberg 	struct inquiry_entry *p;
1977a3d4e20aSJohan Hedberg 
1978a3d4e20aSJohan Hedberg 	list_del(&ie->list);
1979a3d4e20aSJohan Hedberg 
1980a3d4e20aSJohan Hedberg 	list_for_each_entry(p, &cache->resolve, list) {
1981a3d4e20aSJohan Hedberg 		if (p->name_state != NAME_PENDING &&
1982a3d4e20aSJohan Hedberg 		    abs(p->data.rssi) >= abs(ie->data.rssi))
1983a3d4e20aSJohan Hedberg 			break;
1984a3d4e20aSJohan Hedberg 		pos = &p->list;
1985a3d4e20aSJohan Hedberg 	}
1986a3d4e20aSJohan Hedberg 
1987a3d4e20aSJohan Hedberg 	list_add(&ie->list, pos);
1988a3d4e20aSJohan Hedberg }
1989a3d4e20aSJohan Hedberg 
19903175405bSJohan Hedberg bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
1991388fc8faSJohan Hedberg 			      bool name_known, bool *ssp)
19921da177e4SLinus Torvalds {
199330883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
199470f23020SAndrei Emeltchenko 	struct inquiry_entry *ie;
19951da177e4SLinus Torvalds 
19966ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, &data->bdaddr);
19971da177e4SLinus Torvalds 
19982b2fec4dSSzymon Janc 	hci_remove_remote_oob_data(hdev, &data->bdaddr);
19992b2fec4dSSzymon Janc 
2000388fc8faSJohan Hedberg 	*ssp = data->ssp_mode;
2001388fc8faSJohan Hedberg 
200270f23020SAndrei Emeltchenko 	ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr);
2003a3d4e20aSJohan Hedberg 	if (ie) {
20048002d77cSJohan Hedberg 		if (ie->data.ssp_mode)
2005388fc8faSJohan Hedberg 			*ssp = true;
2006388fc8faSJohan Hedberg 
2007a3d4e20aSJohan Hedberg 		if (ie->name_state == NAME_NEEDED &&
2008a3d4e20aSJohan Hedberg 		    data->rssi != ie->data.rssi) {
2009a3d4e20aSJohan Hedberg 			ie->data.rssi = data->rssi;
2010a3d4e20aSJohan Hedberg 			hci_inquiry_cache_update_resolve(hdev, ie);
2011a3d4e20aSJohan Hedberg 		}
2012a3d4e20aSJohan Hedberg 
2013561aafbcSJohan Hedberg 		goto update;
2014a3d4e20aSJohan Hedberg 	}
2015561aafbcSJohan Hedberg 
20161da177e4SLinus Torvalds 	/* Entry not in the cache. Add new one. */
201770f23020SAndrei Emeltchenko 	ie = kzalloc(sizeof(struct inquiry_entry), GFP_ATOMIC);
201870f23020SAndrei Emeltchenko 	if (!ie)
20193175405bSJohan Hedberg 		return false;
202070f23020SAndrei Emeltchenko 
2021561aafbcSJohan Hedberg 	list_add(&ie->all, &cache->all);
2022561aafbcSJohan Hedberg 
2023561aafbcSJohan Hedberg 	if (name_known) {
2024561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
2025561aafbcSJohan Hedberg 	} else {
2026561aafbcSJohan Hedberg 		ie->name_state = NAME_NOT_KNOWN;
2027561aafbcSJohan Hedberg 		list_add(&ie->list, &cache->unknown);
2028561aafbcSJohan Hedberg 	}
2029561aafbcSJohan Hedberg 
2030561aafbcSJohan Hedberg update:
2031561aafbcSJohan Hedberg 	if (name_known && ie->name_state != NAME_KNOWN &&
2032561aafbcSJohan Hedberg 	    ie->name_state != NAME_PENDING) {
2033561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
2034561aafbcSJohan Hedberg 		list_del(&ie->list);
20351da177e4SLinus Torvalds 	}
20361da177e4SLinus Torvalds 
203770f23020SAndrei Emeltchenko 	memcpy(&ie->data, data, sizeof(*data));
203870f23020SAndrei Emeltchenko 	ie->timestamp = jiffies;
20391da177e4SLinus Torvalds 	cache->timestamp = jiffies;
20403175405bSJohan Hedberg 
20413175405bSJohan Hedberg 	if (ie->name_state == NAME_NOT_KNOWN)
20423175405bSJohan Hedberg 		return false;
20433175405bSJohan Hedberg 
20443175405bSJohan Hedberg 	return true;
20451da177e4SLinus Torvalds }
20461da177e4SLinus Torvalds 
20471da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf)
20481da177e4SLinus Torvalds {
204930883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
20501da177e4SLinus Torvalds 	struct inquiry_info *info = (struct inquiry_info *) buf;
20511da177e4SLinus Torvalds 	struct inquiry_entry *e;
20521da177e4SLinus Torvalds 	int copied = 0;
20531da177e4SLinus Torvalds 
2054561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
20551da177e4SLinus Torvalds 		struct inquiry_data *data = &e->data;
2056b57c1a56SJohan Hedberg 
2057b57c1a56SJohan Hedberg 		if (copied >= num)
2058b57c1a56SJohan Hedberg 			break;
2059b57c1a56SJohan Hedberg 
20601da177e4SLinus Torvalds 		bacpy(&info->bdaddr, &data->bdaddr);
20611da177e4SLinus Torvalds 		info->pscan_rep_mode	= data->pscan_rep_mode;
20621da177e4SLinus Torvalds 		info->pscan_period_mode	= data->pscan_period_mode;
20631da177e4SLinus Torvalds 		info->pscan_mode	= data->pscan_mode;
20641da177e4SLinus Torvalds 		memcpy(info->dev_class, data->dev_class, 3);
20651da177e4SLinus Torvalds 		info->clock_offset	= data->clock_offset;
2066b57c1a56SJohan Hedberg 
20671da177e4SLinus Torvalds 		info++;
2068b57c1a56SJohan Hedberg 		copied++;
20691da177e4SLinus Torvalds 	}
20701da177e4SLinus Torvalds 
20711da177e4SLinus Torvalds 	BT_DBG("cache %p, copied %d", cache, copied);
20721da177e4SLinus Torvalds 	return copied;
20731da177e4SLinus Torvalds }
20741da177e4SLinus Torvalds 
207542c6b129SJohan Hedberg static void hci_inq_req(struct hci_request *req, unsigned long opt)
20761da177e4SLinus Torvalds {
20771da177e4SLinus Torvalds 	struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt;
207842c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
20791da177e4SLinus Torvalds 	struct hci_cp_inquiry cp;
20801da177e4SLinus Torvalds 
20811da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
20821da177e4SLinus Torvalds 
20831da177e4SLinus Torvalds 	if (test_bit(HCI_INQUIRY, &hdev->flags))
20841da177e4SLinus Torvalds 		return;
20851da177e4SLinus Torvalds 
20861da177e4SLinus Torvalds 	/* Start Inquiry */
20871da177e4SLinus Torvalds 	memcpy(&cp.lap, &ir->lap, 3);
20881da177e4SLinus Torvalds 	cp.length  = ir->length;
20891da177e4SLinus Torvalds 	cp.num_rsp = ir->num_rsp;
209042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);
20911da177e4SLinus Torvalds }
20921da177e4SLinus Torvalds 
20933e13fa1eSAndre Guedes static int wait_inquiry(void *word)
20943e13fa1eSAndre Guedes {
20953e13fa1eSAndre Guedes 	schedule();
20963e13fa1eSAndre Guedes 	return signal_pending(current);
20973e13fa1eSAndre Guedes }
20983e13fa1eSAndre Guedes 
20991da177e4SLinus Torvalds int hci_inquiry(void __user *arg)
21001da177e4SLinus Torvalds {
21011da177e4SLinus Torvalds 	__u8 __user *ptr = arg;
21021da177e4SLinus Torvalds 	struct hci_inquiry_req ir;
21031da177e4SLinus Torvalds 	struct hci_dev *hdev;
21041da177e4SLinus Torvalds 	int err = 0, do_inquiry = 0, max_rsp;
21051da177e4SLinus Torvalds 	long timeo;
21061da177e4SLinus Torvalds 	__u8 *buf;
21071da177e4SLinus Torvalds 
21081da177e4SLinus Torvalds 	if (copy_from_user(&ir, ptr, sizeof(ir)))
21091da177e4SLinus Torvalds 		return -EFAULT;
21101da177e4SLinus Torvalds 
21115a08ecceSAndrei Emeltchenko 	hdev = hci_dev_get(ir.dev_id);
21125a08ecceSAndrei Emeltchenko 	if (!hdev)
21131da177e4SLinus Torvalds 		return -ENODEV;
21141da177e4SLinus Torvalds 
21150736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
21160736cfa8SMarcel Holtmann 		err = -EBUSY;
21170736cfa8SMarcel Holtmann 		goto done;
21180736cfa8SMarcel Holtmann 	}
21190736cfa8SMarcel Holtmann 
2120fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) {
2121fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
2122fee746b0SMarcel Holtmann 		goto done;
2123fee746b0SMarcel Holtmann 	}
2124fee746b0SMarcel Holtmann 
21255b69bef5SMarcel Holtmann 	if (hdev->dev_type != HCI_BREDR) {
21265b69bef5SMarcel Holtmann 		err = -EOPNOTSUPP;
21275b69bef5SMarcel Holtmann 		goto done;
21285b69bef5SMarcel Holtmann 	}
21295b69bef5SMarcel Holtmann 
213056f87901SJohan Hedberg 	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
213156f87901SJohan Hedberg 		err = -EOPNOTSUPP;
213256f87901SJohan Hedberg 		goto done;
213356f87901SJohan Hedberg 	}
213456f87901SJohan Hedberg 
213509fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
21361da177e4SLinus Torvalds 	if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
2137a8c5fb1aSGustavo Padovan 	    inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {
21381f9b9a5dSAndre Guedes 		hci_inquiry_cache_flush(hdev);
21391da177e4SLinus Torvalds 		do_inquiry = 1;
21401da177e4SLinus Torvalds 	}
214109fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
21421da177e4SLinus Torvalds 
214304837f64SMarcel Holtmann 	timeo = ir.length * msecs_to_jiffies(2000);
214470f23020SAndrei Emeltchenko 
214570f23020SAndrei Emeltchenko 	if (do_inquiry) {
214601178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir,
214701178cd4SJohan Hedberg 				   timeo);
214870f23020SAndrei Emeltchenko 		if (err < 0)
21491da177e4SLinus Torvalds 			goto done;
21503e13fa1eSAndre Guedes 
21513e13fa1eSAndre Guedes 		/* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is
21523e13fa1eSAndre Guedes 		 * cleared). If it is interrupted by a signal, return -EINTR.
21533e13fa1eSAndre Guedes 		 */
21543e13fa1eSAndre Guedes 		if (wait_on_bit(&hdev->flags, HCI_INQUIRY, wait_inquiry,
21553e13fa1eSAndre Guedes 				TASK_INTERRUPTIBLE))
21563e13fa1eSAndre Guedes 			return -EINTR;
215770f23020SAndrei Emeltchenko 	}
21581da177e4SLinus Torvalds 
21598fc9ced3SGustavo Padovan 	/* for unlimited number of responses we will use buffer with
21608fc9ced3SGustavo Padovan 	 * 255 entries
21618fc9ced3SGustavo Padovan 	 */
21621da177e4SLinus Torvalds 	max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp;
21631da177e4SLinus Torvalds 
21641da177e4SLinus Torvalds 	/* cache_dump can't sleep. Therefore we allocate temp buffer and then
21651da177e4SLinus Torvalds 	 * copy it to the user space.
21661da177e4SLinus Torvalds 	 */
216770f23020SAndrei Emeltchenko 	buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL);
216870f23020SAndrei Emeltchenko 	if (!buf) {
21691da177e4SLinus Torvalds 		err = -ENOMEM;
21701da177e4SLinus Torvalds 		goto done;
21711da177e4SLinus Torvalds 	}
21721da177e4SLinus Torvalds 
217309fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
21741da177e4SLinus Torvalds 	ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf);
217509fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
21761da177e4SLinus Torvalds 
21771da177e4SLinus Torvalds 	BT_DBG("num_rsp %d", ir.num_rsp);
21781da177e4SLinus Torvalds 
21791da177e4SLinus Torvalds 	if (!copy_to_user(ptr, &ir, sizeof(ir))) {
21801da177e4SLinus Torvalds 		ptr += sizeof(ir);
21811da177e4SLinus Torvalds 		if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) *
21821da177e4SLinus Torvalds 				 ir.num_rsp))
21831da177e4SLinus Torvalds 			err = -EFAULT;
21841da177e4SLinus Torvalds 	} else
21851da177e4SLinus Torvalds 		err = -EFAULT;
21861da177e4SLinus Torvalds 
21871da177e4SLinus Torvalds 	kfree(buf);
21881da177e4SLinus Torvalds 
21891da177e4SLinus Torvalds done:
21901da177e4SLinus Torvalds 	hci_dev_put(hdev);
21911da177e4SLinus Torvalds 	return err;
21921da177e4SLinus Torvalds }
21931da177e4SLinus Torvalds 
2194cbed0ca1SJohan Hedberg static int hci_dev_do_open(struct hci_dev *hdev)
21951da177e4SLinus Torvalds {
21961da177e4SLinus Torvalds 	int ret = 0;
21971da177e4SLinus Torvalds 
21981da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
21991da177e4SLinus Torvalds 
22001da177e4SLinus Torvalds 	hci_req_lock(hdev);
22011da177e4SLinus Torvalds 
220294324962SJohan Hovold 	if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) {
220394324962SJohan Hovold 		ret = -ENODEV;
220494324962SJohan Hovold 		goto done;
220594324962SJohan Hovold 	}
220694324962SJohan Hovold 
2207a5c8f270SMarcel Holtmann 	if (!test_bit(HCI_SETUP, &hdev->dev_flags)) {
2208a5c8f270SMarcel Holtmann 		/* Check for rfkill but allow the HCI setup stage to
2209a5c8f270SMarcel Holtmann 		 * proceed (which in itself doesn't cause any RF activity).
2210bf543036SJohan Hedberg 		 */
2211a5c8f270SMarcel Holtmann 		if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
2212611b30f7SMarcel Holtmann 			ret = -ERFKILL;
2213611b30f7SMarcel Holtmann 			goto done;
2214611b30f7SMarcel Holtmann 		}
2215611b30f7SMarcel Holtmann 
2216a5c8f270SMarcel Holtmann 		/* Check for valid public address or a configured static
2217a5c8f270SMarcel Holtmann 		 * random adddress, but let the HCI setup proceed to
2218a5c8f270SMarcel Holtmann 		 * be able to determine if there is a public address
2219a5c8f270SMarcel Holtmann 		 * or not.
2220a5c8f270SMarcel Holtmann 		 *
2221c6beca0eSMarcel Holtmann 		 * In case of user channel usage, it is not important
2222c6beca0eSMarcel Holtmann 		 * if a public address or static random address is
2223c6beca0eSMarcel Holtmann 		 * available.
2224c6beca0eSMarcel Holtmann 		 *
2225a5c8f270SMarcel Holtmann 		 * This check is only valid for BR/EDR controllers
2226a5c8f270SMarcel Holtmann 		 * since AMP controllers do not have an address.
2227a5c8f270SMarcel Holtmann 		 */
2228c6beca0eSMarcel Holtmann 		if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
2229c6beca0eSMarcel Holtmann 		    hdev->dev_type == HCI_BREDR &&
2230a5c8f270SMarcel Holtmann 		    !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
2231a5c8f270SMarcel Holtmann 		    !bacmp(&hdev->static_addr, BDADDR_ANY)) {
2232a5c8f270SMarcel Holtmann 			ret = -EADDRNOTAVAIL;
2233a5c8f270SMarcel Holtmann 			goto done;
2234a5c8f270SMarcel Holtmann 		}
2235a5c8f270SMarcel Holtmann 	}
2236a5c8f270SMarcel Holtmann 
22371da177e4SLinus Torvalds 	if (test_bit(HCI_UP, &hdev->flags)) {
22381da177e4SLinus Torvalds 		ret = -EALREADY;
22391da177e4SLinus Torvalds 		goto done;
22401da177e4SLinus Torvalds 	}
22411da177e4SLinus Torvalds 
22421da177e4SLinus Torvalds 	if (hdev->open(hdev)) {
22431da177e4SLinus Torvalds 		ret = -EIO;
22441da177e4SLinus Torvalds 		goto done;
22451da177e4SLinus Torvalds 	}
22461da177e4SLinus Torvalds 
22471da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
22481da177e4SLinus Torvalds 	set_bit(HCI_INIT, &hdev->flags);
2249f41c70c4SMarcel Holtmann 
2250f41c70c4SMarcel Holtmann 	if (hdev->setup && test_bit(HCI_SETUP, &hdev->dev_flags))
2251f41c70c4SMarcel Holtmann 		ret = hdev->setup(hdev);
2252f41c70c4SMarcel Holtmann 
2253f41c70c4SMarcel Holtmann 	if (!ret) {
2254fee746b0SMarcel Holtmann 		if (!test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks) &&
22550736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
22562177bab5SJohan Hedberg 			ret = __hci_init(hdev);
22571da177e4SLinus Torvalds 	}
22581da177e4SLinus Torvalds 
2259f41c70c4SMarcel Holtmann 	clear_bit(HCI_INIT, &hdev->flags);
2260f41c70c4SMarcel Holtmann 
22611da177e4SLinus Torvalds 	if (!ret) {
22621da177e4SLinus Torvalds 		hci_dev_hold(hdev);
2263d6bfd59cSJohan Hedberg 		set_bit(HCI_RPA_EXPIRED, &hdev->dev_flags);
22641da177e4SLinus Torvalds 		set_bit(HCI_UP, &hdev->flags);
22651da177e4SLinus Torvalds 		hci_notify(hdev, HCI_DEV_UP);
2266bb4b2a9aSAndrei Emeltchenko 		if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
22670736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
22681514b892SMarcel Holtmann 		    hdev->dev_type == HCI_BREDR) {
226909fd0de5SGustavo F. Padovan 			hci_dev_lock(hdev);
2270744cf19eSJohan Hedberg 			mgmt_powered(hdev, 1);
227109fd0de5SGustavo F. Padovan 			hci_dev_unlock(hdev);
227256e5cb86SJohan Hedberg 		}
22731da177e4SLinus Torvalds 	} else {
22741da177e4SLinus Torvalds 		/* Init failed, cleanup */
22753eff45eaSGustavo F. Padovan 		flush_work(&hdev->tx_work);
2276c347b765SGustavo F. Padovan 		flush_work(&hdev->cmd_work);
2277b78752ccSMarcel Holtmann 		flush_work(&hdev->rx_work);
22781da177e4SLinus Torvalds 
22791da177e4SLinus Torvalds 		skb_queue_purge(&hdev->cmd_q);
22801da177e4SLinus Torvalds 		skb_queue_purge(&hdev->rx_q);
22811da177e4SLinus Torvalds 
22821da177e4SLinus Torvalds 		if (hdev->flush)
22831da177e4SLinus Torvalds 			hdev->flush(hdev);
22841da177e4SLinus Torvalds 
22851da177e4SLinus Torvalds 		if (hdev->sent_cmd) {
22861da177e4SLinus Torvalds 			kfree_skb(hdev->sent_cmd);
22871da177e4SLinus Torvalds 			hdev->sent_cmd = NULL;
22881da177e4SLinus Torvalds 		}
22891da177e4SLinus Torvalds 
22901da177e4SLinus Torvalds 		hdev->close(hdev);
2291fee746b0SMarcel Holtmann 		hdev->flags &= BIT(HCI_RAW);
22921da177e4SLinus Torvalds 	}
22931da177e4SLinus Torvalds 
22941da177e4SLinus Torvalds done:
22951da177e4SLinus Torvalds 	hci_req_unlock(hdev);
22961da177e4SLinus Torvalds 	return ret;
22971da177e4SLinus Torvalds }
22981da177e4SLinus Torvalds 
2299cbed0ca1SJohan Hedberg /* ---- HCI ioctl helpers ---- */
2300cbed0ca1SJohan Hedberg 
2301cbed0ca1SJohan Hedberg int hci_dev_open(__u16 dev)
2302cbed0ca1SJohan Hedberg {
2303cbed0ca1SJohan Hedberg 	struct hci_dev *hdev;
2304cbed0ca1SJohan Hedberg 	int err;
2305cbed0ca1SJohan Hedberg 
2306cbed0ca1SJohan Hedberg 	hdev = hci_dev_get(dev);
2307cbed0ca1SJohan Hedberg 	if (!hdev)
2308cbed0ca1SJohan Hedberg 		return -ENODEV;
2309cbed0ca1SJohan Hedberg 
2310fee746b0SMarcel Holtmann 	/* Devices that are marked for raw-only usage can only be powered
2311fee746b0SMarcel Holtmann 	 * up as user channel. Trying to bring them up as normal devices
2312fee746b0SMarcel Holtmann 	 * will result into a failure. Only user channel operation is
2313fee746b0SMarcel Holtmann 	 * possible.
2314fee746b0SMarcel Holtmann 	 *
2315fee746b0SMarcel Holtmann 	 * When this function is called for a user channel, the flag
2316fee746b0SMarcel Holtmann 	 * HCI_USER_CHANNEL will be set first before attempting to
2317fee746b0SMarcel Holtmann 	 * open the device.
2318fee746b0SMarcel Holtmann 	 */
2319fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks) &&
2320fee746b0SMarcel Holtmann 	    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
2321fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
2322fee746b0SMarcel Holtmann 		goto done;
2323fee746b0SMarcel Holtmann 	}
2324fee746b0SMarcel Holtmann 
2325e1d08f40SJohan Hedberg 	/* We need to ensure that no other power on/off work is pending
2326e1d08f40SJohan Hedberg 	 * before proceeding to call hci_dev_do_open. This is
2327e1d08f40SJohan Hedberg 	 * particularly important if the setup procedure has not yet
2328e1d08f40SJohan Hedberg 	 * completed.
2329e1d08f40SJohan Hedberg 	 */
2330e1d08f40SJohan Hedberg 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
2331e1d08f40SJohan Hedberg 		cancel_delayed_work(&hdev->power_off);
2332e1d08f40SJohan Hedberg 
2333a5c8f270SMarcel Holtmann 	/* After this call it is guaranteed that the setup procedure
2334a5c8f270SMarcel Holtmann 	 * has finished. This means that error conditions like RFKILL
2335a5c8f270SMarcel Holtmann 	 * or no valid public or static random address apply.
2336a5c8f270SMarcel Holtmann 	 */
2337e1d08f40SJohan Hedberg 	flush_workqueue(hdev->req_workqueue);
2338e1d08f40SJohan Hedberg 
2339cbed0ca1SJohan Hedberg 	err = hci_dev_do_open(hdev);
2340cbed0ca1SJohan Hedberg 
2341fee746b0SMarcel Holtmann done:
2342cbed0ca1SJohan Hedberg 	hci_dev_put(hdev);
2343cbed0ca1SJohan Hedberg 	return err;
2344cbed0ca1SJohan Hedberg }
2345cbed0ca1SJohan Hedberg 
23461da177e4SLinus Torvalds static int hci_dev_do_close(struct hci_dev *hdev)
23471da177e4SLinus Torvalds {
23481da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
23491da177e4SLinus Torvalds 
235078c04c0bSVinicius Costa Gomes 	cancel_delayed_work(&hdev->power_off);
235178c04c0bSVinicius Costa Gomes 
23521da177e4SLinus Torvalds 	hci_req_cancel(hdev, ENODEV);
23531da177e4SLinus Torvalds 	hci_req_lock(hdev);
23541da177e4SLinus Torvalds 
23551da177e4SLinus Torvalds 	if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
235665cc2b49SMarcel Holtmann 		cancel_delayed_work_sync(&hdev->cmd_timer);
23571da177e4SLinus Torvalds 		hci_req_unlock(hdev);
23581da177e4SLinus Torvalds 		return 0;
23591da177e4SLinus Torvalds 	}
23601da177e4SLinus Torvalds 
23613eff45eaSGustavo F. Padovan 	/* Flush RX and TX works */
23623eff45eaSGustavo F. Padovan 	flush_work(&hdev->tx_work);
2363b78752ccSMarcel Holtmann 	flush_work(&hdev->rx_work);
23641da177e4SLinus Torvalds 
236516ab91abSJohan Hedberg 	if (hdev->discov_timeout > 0) {
2366e0f9309fSJohan Hedberg 		cancel_delayed_work(&hdev->discov_off);
236716ab91abSJohan Hedberg 		hdev->discov_timeout = 0;
23685e5282bbSJohan Hedberg 		clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
2369310a3d48SMarcel Holtmann 		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
237016ab91abSJohan Hedberg 	}
237116ab91abSJohan Hedberg 
2372a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
23737d78525dSJohan Hedberg 		cancel_delayed_work(&hdev->service_cache);
23747d78525dSJohan Hedberg 
23757ba8b4beSAndre Guedes 	cancel_delayed_work_sync(&hdev->le_scan_disable);
23764518bb0fSJohan Hedberg 
23774518bb0fSJohan Hedberg 	if (test_bit(HCI_MGMT, &hdev->dev_flags))
2378d6bfd59cSJohan Hedberg 		cancel_delayed_work_sync(&hdev->rpa_expired);
23797ba8b4beSAndre Guedes 
238009fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
23811f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
23821da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
23836046dc3eSAndre Guedes 	hci_pend_le_conns_clear(hdev);
238409fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
23851da177e4SLinus Torvalds 
23861da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_DOWN);
23871da177e4SLinus Torvalds 
23881da177e4SLinus Torvalds 	if (hdev->flush)
23891da177e4SLinus Torvalds 		hdev->flush(hdev);
23901da177e4SLinus Torvalds 
23911da177e4SLinus Torvalds 	/* Reset device */
23921da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
23931da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
2394fee746b0SMarcel Holtmann 	if (!test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks) &&
23953a6afbd2SMarcel Holtmann 	    !test_bit(HCI_AUTO_OFF, &hdev->dev_flags) &&
2396a6c511c6SSzymon Janc 	    test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) {
23971da177e4SLinus Torvalds 		set_bit(HCI_INIT, &hdev->flags);
239801178cd4SJohan Hedberg 		__hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT);
23991da177e4SLinus Torvalds 		clear_bit(HCI_INIT, &hdev->flags);
24001da177e4SLinus Torvalds 	}
24011da177e4SLinus Torvalds 
2402c347b765SGustavo F. Padovan 	/* flush cmd  work */
2403c347b765SGustavo F. Padovan 	flush_work(&hdev->cmd_work);
24041da177e4SLinus Torvalds 
24051da177e4SLinus Torvalds 	/* Drop queues */
24061da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
24071da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
24081da177e4SLinus Torvalds 	skb_queue_purge(&hdev->raw_q);
24091da177e4SLinus Torvalds 
24101da177e4SLinus Torvalds 	/* Drop last sent command */
24111da177e4SLinus Torvalds 	if (hdev->sent_cmd) {
241265cc2b49SMarcel Holtmann 		cancel_delayed_work_sync(&hdev->cmd_timer);
24131da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
24141da177e4SLinus Torvalds 		hdev->sent_cmd = NULL;
24151da177e4SLinus Torvalds 	}
24161da177e4SLinus Torvalds 
2417b6ddb638SJohan Hedberg 	kfree_skb(hdev->recv_evt);
2418b6ddb638SJohan Hedberg 	hdev->recv_evt = NULL;
2419b6ddb638SJohan Hedberg 
24201da177e4SLinus Torvalds 	/* After this point our queues are empty
24211da177e4SLinus Torvalds 	 * and no tasks are scheduled. */
24221da177e4SLinus Torvalds 	hdev->close(hdev);
24231da177e4SLinus Torvalds 
242435b973c9SJohan Hedberg 	/* Clear flags */
2425fee746b0SMarcel Holtmann 	hdev->flags &= BIT(HCI_RAW);
242635b973c9SJohan Hedberg 	hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
242735b973c9SJohan Hedberg 
242893c311a0SMarcel Holtmann 	if (!test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
242993c311a0SMarcel Holtmann 		if (hdev->dev_type == HCI_BREDR) {
243009fd0de5SGustavo F. Padovan 			hci_dev_lock(hdev);
2431744cf19eSJohan Hedberg 			mgmt_powered(hdev, 0);
243209fd0de5SGustavo F. Padovan 			hci_dev_unlock(hdev);
24338ee56540SMarcel Holtmann 		}
243493c311a0SMarcel Holtmann 	}
24355add6af8SJohan Hedberg 
2436ced5c338SAndrei Emeltchenko 	/* Controller radio is available but is currently powered down */
2437536619e8SMarcel Holtmann 	hdev->amp_status = AMP_STATUS_POWERED_DOWN;
2438ced5c338SAndrei Emeltchenko 
2439e59fda8dSJohan Hedberg 	memset(hdev->eir, 0, sizeof(hdev->eir));
244009b3c3fbSJohan Hedberg 	memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
24417a4cd51dSMarcel Holtmann 	bacpy(&hdev->random_addr, BDADDR_ANY);
2442e59fda8dSJohan Hedberg 
24431da177e4SLinus Torvalds 	hci_req_unlock(hdev);
24441da177e4SLinus Torvalds 
24451da177e4SLinus Torvalds 	hci_dev_put(hdev);
24461da177e4SLinus Torvalds 	return 0;
24471da177e4SLinus Torvalds }
24481da177e4SLinus Torvalds 
24491da177e4SLinus Torvalds int hci_dev_close(__u16 dev)
24501da177e4SLinus Torvalds {
24511da177e4SLinus Torvalds 	struct hci_dev *hdev;
24521da177e4SLinus Torvalds 	int err;
24531da177e4SLinus Torvalds 
245470f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
245570f23020SAndrei Emeltchenko 	if (!hdev)
24561da177e4SLinus Torvalds 		return -ENODEV;
24578ee56540SMarcel Holtmann 
24580736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
24590736cfa8SMarcel Holtmann 		err = -EBUSY;
24600736cfa8SMarcel Holtmann 		goto done;
24610736cfa8SMarcel Holtmann 	}
24620736cfa8SMarcel Holtmann 
24638ee56540SMarcel Holtmann 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
24648ee56540SMarcel Holtmann 		cancel_delayed_work(&hdev->power_off);
24658ee56540SMarcel Holtmann 
24661da177e4SLinus Torvalds 	err = hci_dev_do_close(hdev);
24678ee56540SMarcel Holtmann 
24680736cfa8SMarcel Holtmann done:
24691da177e4SLinus Torvalds 	hci_dev_put(hdev);
24701da177e4SLinus Torvalds 	return err;
24711da177e4SLinus Torvalds }
24721da177e4SLinus Torvalds 
24731da177e4SLinus Torvalds int hci_dev_reset(__u16 dev)
24741da177e4SLinus Torvalds {
24751da177e4SLinus Torvalds 	struct hci_dev *hdev;
24761da177e4SLinus Torvalds 	int ret = 0;
24771da177e4SLinus Torvalds 
247870f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
247970f23020SAndrei Emeltchenko 	if (!hdev)
24801da177e4SLinus Torvalds 		return -ENODEV;
24811da177e4SLinus Torvalds 
24821da177e4SLinus Torvalds 	hci_req_lock(hdev);
24831da177e4SLinus Torvalds 
2484808a049eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags)) {
2485808a049eSMarcel Holtmann 		ret = -ENETDOWN;
24861da177e4SLinus Torvalds 		goto done;
2487808a049eSMarcel Holtmann 	}
24881da177e4SLinus Torvalds 
24890736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
24900736cfa8SMarcel Holtmann 		ret = -EBUSY;
24910736cfa8SMarcel Holtmann 		goto done;
24920736cfa8SMarcel Holtmann 	}
24930736cfa8SMarcel Holtmann 
2494fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) {
2495fee746b0SMarcel Holtmann 		ret = -EOPNOTSUPP;
2496fee746b0SMarcel Holtmann 		goto done;
2497fee746b0SMarcel Holtmann 	}
2498fee746b0SMarcel Holtmann 
24991da177e4SLinus Torvalds 	/* Drop queues */
25001da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
25011da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
25021da177e4SLinus Torvalds 
250309fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
25041f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
25051da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
250609fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
25071da177e4SLinus Torvalds 
25081da177e4SLinus Torvalds 	if (hdev->flush)
25091da177e4SLinus Torvalds 		hdev->flush(hdev);
25101da177e4SLinus Torvalds 
25111da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
25126ed58ec5SVille Tervo 	hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
25131da177e4SLinus Torvalds 
251401178cd4SJohan Hedberg 	ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT);
25151da177e4SLinus Torvalds 
25161da177e4SLinus Torvalds done:
25171da177e4SLinus Torvalds 	hci_req_unlock(hdev);
25181da177e4SLinus Torvalds 	hci_dev_put(hdev);
25191da177e4SLinus Torvalds 	return ret;
25201da177e4SLinus Torvalds }
25211da177e4SLinus Torvalds 
25221da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev)
25231da177e4SLinus Torvalds {
25241da177e4SLinus Torvalds 	struct hci_dev *hdev;
25251da177e4SLinus Torvalds 	int ret = 0;
25261da177e4SLinus Torvalds 
252770f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
252870f23020SAndrei Emeltchenko 	if (!hdev)
25291da177e4SLinus Torvalds 		return -ENODEV;
25301da177e4SLinus Torvalds 
25310736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
25320736cfa8SMarcel Holtmann 		ret = -EBUSY;
25330736cfa8SMarcel Holtmann 		goto done;
25340736cfa8SMarcel Holtmann 	}
25350736cfa8SMarcel Holtmann 
2536fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) {
2537fee746b0SMarcel Holtmann 		ret = -EOPNOTSUPP;
2538fee746b0SMarcel Holtmann 		goto done;
2539fee746b0SMarcel Holtmann 	}
2540fee746b0SMarcel Holtmann 
25411da177e4SLinus Torvalds 	memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
25421da177e4SLinus Torvalds 
25430736cfa8SMarcel Holtmann done:
25441da177e4SLinus Torvalds 	hci_dev_put(hdev);
25451da177e4SLinus Torvalds 	return ret;
25461da177e4SLinus Torvalds }
25471da177e4SLinus Torvalds 
25481da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg)
25491da177e4SLinus Torvalds {
25501da177e4SLinus Torvalds 	struct hci_dev *hdev;
25511da177e4SLinus Torvalds 	struct hci_dev_req dr;
25521da177e4SLinus Torvalds 	int err = 0;
25531da177e4SLinus Torvalds 
25541da177e4SLinus Torvalds 	if (copy_from_user(&dr, arg, sizeof(dr)))
25551da177e4SLinus Torvalds 		return -EFAULT;
25561da177e4SLinus Torvalds 
255770f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dr.dev_id);
255870f23020SAndrei Emeltchenko 	if (!hdev)
25591da177e4SLinus Torvalds 		return -ENODEV;
25601da177e4SLinus Torvalds 
25610736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
25620736cfa8SMarcel Holtmann 		err = -EBUSY;
25630736cfa8SMarcel Holtmann 		goto done;
25640736cfa8SMarcel Holtmann 	}
25650736cfa8SMarcel Holtmann 
2566fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) {
2567fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
2568fee746b0SMarcel Holtmann 		goto done;
2569fee746b0SMarcel Holtmann 	}
2570fee746b0SMarcel Holtmann 
25715b69bef5SMarcel Holtmann 	if (hdev->dev_type != HCI_BREDR) {
25725b69bef5SMarcel Holtmann 		err = -EOPNOTSUPP;
25735b69bef5SMarcel Holtmann 		goto done;
25745b69bef5SMarcel Holtmann 	}
25755b69bef5SMarcel Holtmann 
257656f87901SJohan Hedberg 	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
257756f87901SJohan Hedberg 		err = -EOPNOTSUPP;
257856f87901SJohan Hedberg 		goto done;
257956f87901SJohan Hedberg 	}
258056f87901SJohan Hedberg 
25811da177e4SLinus Torvalds 	switch (cmd) {
25821da177e4SLinus Torvalds 	case HCISETAUTH:
258301178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
25845f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
25851da177e4SLinus Torvalds 		break;
25861da177e4SLinus Torvalds 
25871da177e4SLinus Torvalds 	case HCISETENCRYPT:
25881da177e4SLinus Torvalds 		if (!lmp_encrypt_capable(hdev)) {
25891da177e4SLinus Torvalds 			err = -EOPNOTSUPP;
25901da177e4SLinus Torvalds 			break;
25911da177e4SLinus Torvalds 		}
25921da177e4SLinus Torvalds 
25931da177e4SLinus Torvalds 		if (!test_bit(HCI_AUTH, &hdev->flags)) {
25941da177e4SLinus Torvalds 			/* Auth must be enabled first */
259501178cd4SJohan Hedberg 			err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
25965f246e89SAndrei Emeltchenko 					   HCI_INIT_TIMEOUT);
25971da177e4SLinus Torvalds 			if (err)
25981da177e4SLinus Torvalds 				break;
25991da177e4SLinus Torvalds 		}
26001da177e4SLinus Torvalds 
260101178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
26025f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
26031da177e4SLinus Torvalds 		break;
26041da177e4SLinus Torvalds 
26051da177e4SLinus Torvalds 	case HCISETSCAN:
260601178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
26075f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
26081da177e4SLinus Torvalds 		break;
26091da177e4SLinus Torvalds 
26101da177e4SLinus Torvalds 	case HCISETLINKPOL:
261101178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
26125f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
26131da177e4SLinus Torvalds 		break;
26141da177e4SLinus Torvalds 
26151da177e4SLinus Torvalds 	case HCISETLINKMODE:
2616e4e8e37cSMarcel Holtmann 		hdev->link_mode = ((__u16) dr.dev_opt) &
2617e4e8e37cSMarcel Holtmann 					(HCI_LM_MASTER | HCI_LM_ACCEPT);
2618e4e8e37cSMarcel Holtmann 		break;
2619e4e8e37cSMarcel Holtmann 
2620e4e8e37cSMarcel Holtmann 	case HCISETPTYPE:
2621e4e8e37cSMarcel Holtmann 		hdev->pkt_type = (__u16) dr.dev_opt;
26221da177e4SLinus Torvalds 		break;
26231da177e4SLinus Torvalds 
26241da177e4SLinus Torvalds 	case HCISETACLMTU:
26251da177e4SLinus Torvalds 		hdev->acl_mtu  = *((__u16 *) &dr.dev_opt + 1);
26261da177e4SLinus Torvalds 		hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0);
26271da177e4SLinus Torvalds 		break;
26281da177e4SLinus Torvalds 
26291da177e4SLinus Torvalds 	case HCISETSCOMTU:
26301da177e4SLinus Torvalds 		hdev->sco_mtu  = *((__u16 *) &dr.dev_opt + 1);
26311da177e4SLinus Torvalds 		hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0);
26321da177e4SLinus Torvalds 		break;
26331da177e4SLinus Torvalds 
26341da177e4SLinus Torvalds 	default:
26351da177e4SLinus Torvalds 		err = -EINVAL;
26361da177e4SLinus Torvalds 		break;
26371da177e4SLinus Torvalds 	}
2638e4e8e37cSMarcel Holtmann 
26390736cfa8SMarcel Holtmann done:
26401da177e4SLinus Torvalds 	hci_dev_put(hdev);
26411da177e4SLinus Torvalds 	return err;
26421da177e4SLinus Torvalds }
26431da177e4SLinus Torvalds 
26441da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg)
26451da177e4SLinus Torvalds {
26468035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev;
26471da177e4SLinus Torvalds 	struct hci_dev_list_req *dl;
26481da177e4SLinus Torvalds 	struct hci_dev_req *dr;
26491da177e4SLinus Torvalds 	int n = 0, size, err;
26501da177e4SLinus Torvalds 	__u16 dev_num;
26511da177e4SLinus Torvalds 
26521da177e4SLinus Torvalds 	if (get_user(dev_num, (__u16 __user *) arg))
26531da177e4SLinus Torvalds 		return -EFAULT;
26541da177e4SLinus Torvalds 
26551da177e4SLinus Torvalds 	if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr))
26561da177e4SLinus Torvalds 		return -EINVAL;
26571da177e4SLinus Torvalds 
26581da177e4SLinus Torvalds 	size = sizeof(*dl) + dev_num * sizeof(*dr);
26591da177e4SLinus Torvalds 
266070f23020SAndrei Emeltchenko 	dl = kzalloc(size, GFP_KERNEL);
266170f23020SAndrei Emeltchenko 	if (!dl)
26621da177e4SLinus Torvalds 		return -ENOMEM;
26631da177e4SLinus Torvalds 
26641da177e4SLinus Torvalds 	dr = dl->dev_req;
26651da177e4SLinus Torvalds 
2666f20d09d5SGustavo F. Padovan 	read_lock(&hci_dev_list_lock);
26678035ded4SLuiz Augusto von Dentz 	list_for_each_entry(hdev, &hci_dev_list, list) {
2668a8b2d5c2SJohan Hedberg 		if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
2669e0f9309fSJohan Hedberg 			cancel_delayed_work(&hdev->power_off);
2670c542a06cSJohan Hedberg 
2671a8b2d5c2SJohan Hedberg 		if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2672a8b2d5c2SJohan Hedberg 			set_bit(HCI_PAIRABLE, &hdev->dev_flags);
2673c542a06cSJohan Hedberg 
26741da177e4SLinus Torvalds 		(dr + n)->dev_id  = hdev->id;
26751da177e4SLinus Torvalds 		(dr + n)->dev_opt = hdev->flags;
2676c542a06cSJohan Hedberg 
26771da177e4SLinus Torvalds 		if (++n >= dev_num)
26781da177e4SLinus Torvalds 			break;
26791da177e4SLinus Torvalds 	}
2680f20d09d5SGustavo F. Padovan 	read_unlock(&hci_dev_list_lock);
26811da177e4SLinus Torvalds 
26821da177e4SLinus Torvalds 	dl->dev_num = n;
26831da177e4SLinus Torvalds 	size = sizeof(*dl) + n * sizeof(*dr);
26841da177e4SLinus Torvalds 
26851da177e4SLinus Torvalds 	err = copy_to_user(arg, dl, size);
26861da177e4SLinus Torvalds 	kfree(dl);
26871da177e4SLinus Torvalds 
26881da177e4SLinus Torvalds 	return err ? -EFAULT : 0;
26891da177e4SLinus Torvalds }
26901da177e4SLinus Torvalds 
26911da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg)
26921da177e4SLinus Torvalds {
26931da177e4SLinus Torvalds 	struct hci_dev *hdev;
26941da177e4SLinus Torvalds 	struct hci_dev_info di;
26951da177e4SLinus Torvalds 	int err = 0;
26961da177e4SLinus Torvalds 
26971da177e4SLinus Torvalds 	if (copy_from_user(&di, arg, sizeof(di)))
26981da177e4SLinus Torvalds 		return -EFAULT;
26991da177e4SLinus Torvalds 
270070f23020SAndrei Emeltchenko 	hdev = hci_dev_get(di.dev_id);
270170f23020SAndrei Emeltchenko 	if (!hdev)
27021da177e4SLinus Torvalds 		return -ENODEV;
27031da177e4SLinus Torvalds 
2704a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
27053243553fSJohan Hedberg 		cancel_delayed_work_sync(&hdev->power_off);
2706ab81cbf9SJohan Hedberg 
2707a8b2d5c2SJohan Hedberg 	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2708a8b2d5c2SJohan Hedberg 		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
2709c542a06cSJohan Hedberg 
27101da177e4SLinus Torvalds 	strcpy(di.name, hdev->name);
27111da177e4SLinus Torvalds 	di.bdaddr   = hdev->bdaddr;
271260f2a3edSMarcel Holtmann 	di.type     = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4);
27131da177e4SLinus Torvalds 	di.flags    = hdev->flags;
27141da177e4SLinus Torvalds 	di.pkt_type = hdev->pkt_type;
2715572c7f84SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
27161da177e4SLinus Torvalds 		di.acl_mtu  = hdev->acl_mtu;
27171da177e4SLinus Torvalds 		di.acl_pkts = hdev->acl_pkts;
27181da177e4SLinus Torvalds 		di.sco_mtu  = hdev->sco_mtu;
27191da177e4SLinus Torvalds 		di.sco_pkts = hdev->sco_pkts;
2720572c7f84SJohan Hedberg 	} else {
2721572c7f84SJohan Hedberg 		di.acl_mtu  = hdev->le_mtu;
2722572c7f84SJohan Hedberg 		di.acl_pkts = hdev->le_pkts;
2723572c7f84SJohan Hedberg 		di.sco_mtu  = 0;
2724572c7f84SJohan Hedberg 		di.sco_pkts = 0;
2725572c7f84SJohan Hedberg 	}
27261da177e4SLinus Torvalds 	di.link_policy = hdev->link_policy;
27271da177e4SLinus Torvalds 	di.link_mode   = hdev->link_mode;
27281da177e4SLinus Torvalds 
27291da177e4SLinus Torvalds 	memcpy(&di.stat, &hdev->stat, sizeof(di.stat));
27301da177e4SLinus Torvalds 	memcpy(&di.features, &hdev->features, sizeof(di.features));
27311da177e4SLinus Torvalds 
27321da177e4SLinus Torvalds 	if (copy_to_user(arg, &di, sizeof(di)))
27331da177e4SLinus Torvalds 		err = -EFAULT;
27341da177e4SLinus Torvalds 
27351da177e4SLinus Torvalds 	hci_dev_put(hdev);
27361da177e4SLinus Torvalds 
27371da177e4SLinus Torvalds 	return err;
27381da177e4SLinus Torvalds }
27391da177e4SLinus Torvalds 
27401da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */
27411da177e4SLinus Torvalds 
2742611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked)
2743611b30f7SMarcel Holtmann {
2744611b30f7SMarcel Holtmann 	struct hci_dev *hdev = data;
2745611b30f7SMarcel Holtmann 
2746611b30f7SMarcel Holtmann 	BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
2747611b30f7SMarcel Holtmann 
27480736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
27490736cfa8SMarcel Holtmann 		return -EBUSY;
27500736cfa8SMarcel Holtmann 
27515e130367SJohan Hedberg 	if (blocked) {
27525e130367SJohan Hedberg 		set_bit(HCI_RFKILLED, &hdev->dev_flags);
2753bf543036SJohan Hedberg 		if (!test_bit(HCI_SETUP, &hdev->dev_flags))
2754611b30f7SMarcel Holtmann 			hci_dev_do_close(hdev);
27555e130367SJohan Hedberg 	} else {
27565e130367SJohan Hedberg 		clear_bit(HCI_RFKILLED, &hdev->dev_flags);
27575e130367SJohan Hedberg 	}
2758611b30f7SMarcel Holtmann 
2759611b30f7SMarcel Holtmann 	return 0;
2760611b30f7SMarcel Holtmann }
2761611b30f7SMarcel Holtmann 
2762611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = {
2763611b30f7SMarcel Holtmann 	.set_block = hci_rfkill_set_block,
2764611b30f7SMarcel Holtmann };
2765611b30f7SMarcel Holtmann 
2766ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work)
2767ab81cbf9SJohan Hedberg {
2768ab81cbf9SJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev, power_on);
276996570ffcSJohan Hedberg 	int err;
2770ab81cbf9SJohan Hedberg 
2771ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
2772ab81cbf9SJohan Hedberg 
2773cbed0ca1SJohan Hedberg 	err = hci_dev_do_open(hdev);
277496570ffcSJohan Hedberg 	if (err < 0) {
277596570ffcSJohan Hedberg 		mgmt_set_powered_failed(hdev, err);
2776ab81cbf9SJohan Hedberg 		return;
277796570ffcSJohan Hedberg 	}
2778ab81cbf9SJohan Hedberg 
2779a5c8f270SMarcel Holtmann 	/* During the HCI setup phase, a few error conditions are
2780a5c8f270SMarcel Holtmann 	 * ignored and they need to be checked now. If they are still
2781a5c8f270SMarcel Holtmann 	 * valid, it is important to turn the device back off.
2782a5c8f270SMarcel Holtmann 	 */
2783a5c8f270SMarcel Holtmann 	if (test_bit(HCI_RFKILLED, &hdev->dev_flags) ||
2784a5c8f270SMarcel Holtmann 	    (hdev->dev_type == HCI_BREDR &&
2785a5c8f270SMarcel Holtmann 	     !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
2786a5c8f270SMarcel Holtmann 	     !bacmp(&hdev->static_addr, BDADDR_ANY))) {
2787bf543036SJohan Hedberg 		clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
2788bf543036SJohan Hedberg 		hci_dev_do_close(hdev);
2789bf543036SJohan Hedberg 	} else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
279019202573SJohan Hedberg 		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
279119202573SJohan Hedberg 				   HCI_AUTO_OFF_TIMEOUT);
2792bf543036SJohan Hedberg 	}
2793ab81cbf9SJohan Hedberg 
2794fee746b0SMarcel Holtmann 	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags)) {
2795fee746b0SMarcel Holtmann 		if (!test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
2796744cf19eSJohan Hedberg 			mgmt_index_added(hdev);
2797ab81cbf9SJohan Hedberg 	}
2798fee746b0SMarcel Holtmann }
2799ab81cbf9SJohan Hedberg 
2800ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work)
2801ab81cbf9SJohan Hedberg {
28023243553fSJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev,
28033243553fSJohan Hedberg 					    power_off.work);
2804ab81cbf9SJohan Hedberg 
2805ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
2806ab81cbf9SJohan Hedberg 
28078ee56540SMarcel Holtmann 	hci_dev_do_close(hdev);
2808ab81cbf9SJohan Hedberg }
2809ab81cbf9SJohan Hedberg 
281016ab91abSJohan Hedberg static void hci_discov_off(struct work_struct *work)
281116ab91abSJohan Hedberg {
281216ab91abSJohan Hedberg 	struct hci_dev *hdev;
281316ab91abSJohan Hedberg 
281416ab91abSJohan Hedberg 	hdev = container_of(work, struct hci_dev, discov_off.work);
281516ab91abSJohan Hedberg 
281616ab91abSJohan Hedberg 	BT_DBG("%s", hdev->name);
281716ab91abSJohan Hedberg 
2818d1967ff8SMarcel Holtmann 	mgmt_discoverable_timeout(hdev);
281916ab91abSJohan Hedberg }
282016ab91abSJohan Hedberg 
282135f7498aSJohan Hedberg void hci_uuids_clear(struct hci_dev *hdev)
28222aeb9a1aSJohan Hedberg {
28234821002cSJohan Hedberg 	struct bt_uuid *uuid, *tmp;
28242aeb9a1aSJohan Hedberg 
28254821002cSJohan Hedberg 	list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) {
28264821002cSJohan Hedberg 		list_del(&uuid->list);
28272aeb9a1aSJohan Hedberg 		kfree(uuid);
28282aeb9a1aSJohan Hedberg 	}
28292aeb9a1aSJohan Hedberg }
28302aeb9a1aSJohan Hedberg 
283135f7498aSJohan Hedberg void hci_link_keys_clear(struct hci_dev *hdev)
283255ed8ca1SJohan Hedberg {
283355ed8ca1SJohan Hedberg 	struct list_head *p, *n;
283455ed8ca1SJohan Hedberg 
283555ed8ca1SJohan Hedberg 	list_for_each_safe(p, n, &hdev->link_keys) {
283655ed8ca1SJohan Hedberg 		struct link_key *key;
283755ed8ca1SJohan Hedberg 
283855ed8ca1SJohan Hedberg 		key = list_entry(p, struct link_key, list);
283955ed8ca1SJohan Hedberg 
284055ed8ca1SJohan Hedberg 		list_del(p);
284155ed8ca1SJohan Hedberg 		kfree(key);
284255ed8ca1SJohan Hedberg 	}
284355ed8ca1SJohan Hedberg }
284455ed8ca1SJohan Hedberg 
284535f7498aSJohan Hedberg void hci_smp_ltks_clear(struct hci_dev *hdev)
2846b899efafSVinicius Costa Gomes {
2847b899efafSVinicius Costa Gomes 	struct smp_ltk *k, *tmp;
2848b899efafSVinicius Costa Gomes 
2849b899efafSVinicius Costa Gomes 	list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
2850b899efafSVinicius Costa Gomes 		list_del(&k->list);
2851b899efafSVinicius Costa Gomes 		kfree(k);
2852b899efafSVinicius Costa Gomes 	}
2853b899efafSVinicius Costa Gomes }
2854b899efafSVinicius Costa Gomes 
2855970c4e46SJohan Hedberg void hci_smp_irks_clear(struct hci_dev *hdev)
2856970c4e46SJohan Hedberg {
2857970c4e46SJohan Hedberg 	struct smp_irk *k, *tmp;
2858970c4e46SJohan Hedberg 
2859970c4e46SJohan Hedberg 	list_for_each_entry_safe(k, tmp, &hdev->identity_resolving_keys, list) {
2860970c4e46SJohan Hedberg 		list_del(&k->list);
2861970c4e46SJohan Hedberg 		kfree(k);
2862970c4e46SJohan Hedberg 	}
2863970c4e46SJohan Hedberg }
2864970c4e46SJohan Hedberg 
286555ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
286655ed8ca1SJohan Hedberg {
286755ed8ca1SJohan Hedberg 	struct link_key *k;
286855ed8ca1SJohan Hedberg 
28698035ded4SLuiz Augusto von Dentz 	list_for_each_entry(k, &hdev->link_keys, list)
287055ed8ca1SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) == 0)
287155ed8ca1SJohan Hedberg 			return k;
287255ed8ca1SJohan Hedberg 
287355ed8ca1SJohan Hedberg 	return NULL;
287455ed8ca1SJohan Hedberg }
287555ed8ca1SJohan Hedberg 
2876745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
2877d25e28abSJohan Hedberg 			       u8 key_type, u8 old_key_type)
2878d25e28abSJohan Hedberg {
2879d25e28abSJohan Hedberg 	/* Legacy key */
2880d25e28abSJohan Hedberg 	if (key_type < 0x03)
2881745c0ce3SVishal Agarwal 		return true;
2882d25e28abSJohan Hedberg 
2883d25e28abSJohan Hedberg 	/* Debug keys are insecure so don't store them persistently */
2884d25e28abSJohan Hedberg 	if (key_type == HCI_LK_DEBUG_COMBINATION)
2885745c0ce3SVishal Agarwal 		return false;
2886d25e28abSJohan Hedberg 
2887d25e28abSJohan Hedberg 	/* Changed combination key and there's no previous one */
2888d25e28abSJohan Hedberg 	if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff)
2889745c0ce3SVishal Agarwal 		return false;
2890d25e28abSJohan Hedberg 
2891d25e28abSJohan Hedberg 	/* Security mode 3 case */
2892d25e28abSJohan Hedberg 	if (!conn)
2893745c0ce3SVishal Agarwal 		return true;
2894d25e28abSJohan Hedberg 
2895d25e28abSJohan Hedberg 	/* Neither local nor remote side had no-bonding as requirement */
2896d25e28abSJohan Hedberg 	if (conn->auth_type > 0x01 && conn->remote_auth > 0x01)
2897745c0ce3SVishal Agarwal 		return true;
2898d25e28abSJohan Hedberg 
2899d25e28abSJohan Hedberg 	/* Local side had dedicated bonding as requirement */
2900d25e28abSJohan Hedberg 	if (conn->auth_type == 0x02 || conn->auth_type == 0x03)
2901745c0ce3SVishal Agarwal 		return true;
2902d25e28abSJohan Hedberg 
2903d25e28abSJohan Hedberg 	/* Remote side had dedicated bonding as requirement */
2904d25e28abSJohan Hedberg 	if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03)
2905745c0ce3SVishal Agarwal 		return true;
2906d25e28abSJohan Hedberg 
2907d25e28abSJohan Hedberg 	/* If none of the above criteria match, then don't store the key
2908d25e28abSJohan Hedberg 	 * persistently */
2909745c0ce3SVishal Agarwal 	return false;
2910d25e28abSJohan Hedberg }
2911d25e28abSJohan Hedberg 
291298a0b845SJohan Hedberg static bool ltk_type_master(u8 type)
291398a0b845SJohan Hedberg {
2914d97c9fb0SJohan Hedberg 	return (type == SMP_LTK);
291598a0b845SJohan Hedberg }
291698a0b845SJohan Hedberg 
2917fe39c7b2SMarcel Holtmann struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, __le64 rand,
291898a0b845SJohan Hedberg 			     bool master)
291975d262c2SVinicius Costa Gomes {
2920c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
292175d262c2SVinicius Costa Gomes 
2922c9839a11SVinicius Costa Gomes 	list_for_each_entry(k, &hdev->long_term_keys, list) {
2923fe39c7b2SMarcel Holtmann 		if (k->ediv != ediv || k->rand != rand)
292475d262c2SVinicius Costa Gomes 			continue;
292575d262c2SVinicius Costa Gomes 
292698a0b845SJohan Hedberg 		if (ltk_type_master(k->type) != master)
292798a0b845SJohan Hedberg 			continue;
292898a0b845SJohan Hedberg 
292975d262c2SVinicius Costa Gomes 		return k;
293075d262c2SVinicius Costa Gomes 	}
293175d262c2SVinicius Costa Gomes 
293275d262c2SVinicius Costa Gomes 	return NULL;
293375d262c2SVinicius Costa Gomes }
293475d262c2SVinicius Costa Gomes 
2935c9839a11SVinicius Costa Gomes struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
293698a0b845SJohan Hedberg 				     u8 addr_type, bool master)
293775d262c2SVinicius Costa Gomes {
2938c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
293975d262c2SVinicius Costa Gomes 
2940c9839a11SVinicius Costa Gomes 	list_for_each_entry(k, &hdev->long_term_keys, list)
2941c9839a11SVinicius Costa Gomes 		if (addr_type == k->bdaddr_type &&
294298a0b845SJohan Hedberg 		    bacmp(bdaddr, &k->bdaddr) == 0 &&
294398a0b845SJohan Hedberg 		    ltk_type_master(k->type) == master)
294475d262c2SVinicius Costa Gomes 			return k;
294575d262c2SVinicius Costa Gomes 
294675d262c2SVinicius Costa Gomes 	return NULL;
294775d262c2SVinicius Costa Gomes }
294875d262c2SVinicius Costa Gomes 
2949970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa)
2950970c4e46SJohan Hedberg {
2951970c4e46SJohan Hedberg 	struct smp_irk *irk;
2952970c4e46SJohan Hedberg 
2953970c4e46SJohan Hedberg 	list_for_each_entry(irk, &hdev->identity_resolving_keys, list) {
2954970c4e46SJohan Hedberg 		if (!bacmp(&irk->rpa, rpa))
2955970c4e46SJohan Hedberg 			return irk;
2956970c4e46SJohan Hedberg 	}
2957970c4e46SJohan Hedberg 
2958970c4e46SJohan Hedberg 	list_for_each_entry(irk, &hdev->identity_resolving_keys, list) {
2959970c4e46SJohan Hedberg 		if (smp_irk_matches(hdev->tfm_aes, irk->val, rpa)) {
2960970c4e46SJohan Hedberg 			bacpy(&irk->rpa, rpa);
2961970c4e46SJohan Hedberg 			return irk;
2962970c4e46SJohan Hedberg 		}
2963970c4e46SJohan Hedberg 	}
2964970c4e46SJohan Hedberg 
2965970c4e46SJohan Hedberg 	return NULL;
2966970c4e46SJohan Hedberg }
2967970c4e46SJohan Hedberg 
2968970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
2969970c4e46SJohan Hedberg 				     u8 addr_type)
2970970c4e46SJohan Hedberg {
2971970c4e46SJohan Hedberg 	struct smp_irk *irk;
2972970c4e46SJohan Hedberg 
29736cfc9988SJohan Hedberg 	/* Identity Address must be public or static random */
29746cfc9988SJohan Hedberg 	if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0)
29756cfc9988SJohan Hedberg 		return NULL;
29766cfc9988SJohan Hedberg 
2977970c4e46SJohan Hedberg 	list_for_each_entry(irk, &hdev->identity_resolving_keys, list) {
2978970c4e46SJohan Hedberg 		if (addr_type == irk->addr_type &&
2979970c4e46SJohan Hedberg 		    bacmp(bdaddr, &irk->bdaddr) == 0)
2980970c4e46SJohan Hedberg 			return irk;
2981970c4e46SJohan Hedberg 	}
2982970c4e46SJohan Hedberg 
2983970c4e46SJohan Hedberg 	return NULL;
2984970c4e46SJohan Hedberg }
2985970c4e46SJohan Hedberg 
2986567fa2aaSJohan Hedberg struct link_key *hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn,
29877652ff6aSJohan Hedberg 				  bdaddr_t *bdaddr, u8 *val, u8 type,
29887652ff6aSJohan Hedberg 				  u8 pin_len, bool *persistent)
298955ed8ca1SJohan Hedberg {
299055ed8ca1SJohan Hedberg 	struct link_key *key, *old_key;
2991745c0ce3SVishal Agarwal 	u8 old_key_type;
299255ed8ca1SJohan Hedberg 
299355ed8ca1SJohan Hedberg 	old_key = hci_find_link_key(hdev, bdaddr);
299455ed8ca1SJohan Hedberg 	if (old_key) {
299555ed8ca1SJohan Hedberg 		old_key_type = old_key->type;
299655ed8ca1SJohan Hedberg 		key = old_key;
299755ed8ca1SJohan Hedberg 	} else {
299812adcf3aSJohan Hedberg 		old_key_type = conn ? conn->key_type : 0xff;
29990a14ab41SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_KERNEL);
300055ed8ca1SJohan Hedberg 		if (!key)
3001567fa2aaSJohan Hedberg 			return NULL;
300255ed8ca1SJohan Hedberg 		list_add(&key->list, &hdev->link_keys);
300355ed8ca1SJohan Hedberg 	}
300455ed8ca1SJohan Hedberg 
30056ed93dc6SAndrei Emeltchenko 	BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type);
300655ed8ca1SJohan Hedberg 
3007d25e28abSJohan Hedberg 	/* Some buggy controller combinations generate a changed
3008d25e28abSJohan Hedberg 	 * combination key for legacy pairing even when there's no
3009d25e28abSJohan Hedberg 	 * previous key */
3010d25e28abSJohan Hedberg 	if (type == HCI_LK_CHANGED_COMBINATION &&
3011a8c5fb1aSGustavo Padovan 	    (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) {
3012d25e28abSJohan Hedberg 		type = HCI_LK_COMBINATION;
3013655fe6ecSJohan Hedberg 		if (conn)
3014655fe6ecSJohan Hedberg 			conn->key_type = type;
3015655fe6ecSJohan Hedberg 	}
3016d25e28abSJohan Hedberg 
301755ed8ca1SJohan Hedberg 	bacpy(&key->bdaddr, bdaddr);
30189b3b4460SAndrei Emeltchenko 	memcpy(key->val, val, HCI_LINK_KEY_SIZE);
301955ed8ca1SJohan Hedberg 	key->pin_len = pin_len;
302055ed8ca1SJohan Hedberg 
3021b6020ba0SWaldemar Rymarkiewicz 	if (type == HCI_LK_CHANGED_COMBINATION)
302255ed8ca1SJohan Hedberg 		key->type = old_key_type;
30234748fed2SJohan Hedberg 	else
30244748fed2SJohan Hedberg 		key->type = type;
30254748fed2SJohan Hedberg 
30267652ff6aSJohan Hedberg 	if (persistent)
30277652ff6aSJohan Hedberg 		*persistent = hci_persistent_key(hdev, conn, type,
30287652ff6aSJohan Hedberg 						 old_key_type);
302955ed8ca1SJohan Hedberg 
3030567fa2aaSJohan Hedberg 	return key;
303155ed8ca1SJohan Hedberg }
303255ed8ca1SJohan Hedberg 
3033ca9142b8SJohan Hedberg struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
303435d70271SJohan Hedberg 			    u8 addr_type, u8 type, u8 authenticated,
3035fe39c7b2SMarcel Holtmann 			    u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand)
303675d262c2SVinicius Costa Gomes {
3037c9839a11SVinicius Costa Gomes 	struct smp_ltk *key, *old_key;
303898a0b845SJohan Hedberg 	bool master = ltk_type_master(type);
303975d262c2SVinicius Costa Gomes 
304098a0b845SJohan Hedberg 	old_key = hci_find_ltk_by_addr(hdev, bdaddr, addr_type, master);
3041c9839a11SVinicius Costa Gomes 	if (old_key)
304275d262c2SVinicius Costa Gomes 		key = old_key;
3043c9839a11SVinicius Costa Gomes 	else {
30440a14ab41SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_KERNEL);
304575d262c2SVinicius Costa Gomes 		if (!key)
3046ca9142b8SJohan Hedberg 			return NULL;
3047c9839a11SVinicius Costa Gomes 		list_add(&key->list, &hdev->long_term_keys);
304875d262c2SVinicius Costa Gomes 	}
304975d262c2SVinicius Costa Gomes 
305075d262c2SVinicius Costa Gomes 	bacpy(&key->bdaddr, bdaddr);
3051c9839a11SVinicius Costa Gomes 	key->bdaddr_type = addr_type;
3052c9839a11SVinicius Costa Gomes 	memcpy(key->val, tk, sizeof(key->val));
3053c9839a11SVinicius Costa Gomes 	key->authenticated = authenticated;
3054c9839a11SVinicius Costa Gomes 	key->ediv = ediv;
3055fe39c7b2SMarcel Holtmann 	key->rand = rand;
3056c9839a11SVinicius Costa Gomes 	key->enc_size = enc_size;
3057c9839a11SVinicius Costa Gomes 	key->type = type;
305875d262c2SVinicius Costa Gomes 
3059ca9142b8SJohan Hedberg 	return key;
306075d262c2SVinicius Costa Gomes }
306175d262c2SVinicius Costa Gomes 
3062ca9142b8SJohan Hedberg struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
3063ca9142b8SJohan Hedberg 			    u8 addr_type, u8 val[16], bdaddr_t *rpa)
3064970c4e46SJohan Hedberg {
3065970c4e46SJohan Hedberg 	struct smp_irk *irk;
3066970c4e46SJohan Hedberg 
3067970c4e46SJohan Hedberg 	irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type);
3068970c4e46SJohan Hedberg 	if (!irk) {
3069970c4e46SJohan Hedberg 		irk = kzalloc(sizeof(*irk), GFP_KERNEL);
3070970c4e46SJohan Hedberg 		if (!irk)
3071ca9142b8SJohan Hedberg 			return NULL;
3072970c4e46SJohan Hedberg 
3073970c4e46SJohan Hedberg 		bacpy(&irk->bdaddr, bdaddr);
3074970c4e46SJohan Hedberg 		irk->addr_type = addr_type;
3075970c4e46SJohan Hedberg 
3076970c4e46SJohan Hedberg 		list_add(&irk->list, &hdev->identity_resolving_keys);
3077970c4e46SJohan Hedberg 	}
3078970c4e46SJohan Hedberg 
3079970c4e46SJohan Hedberg 	memcpy(irk->val, val, 16);
3080970c4e46SJohan Hedberg 	bacpy(&irk->rpa, rpa);
3081970c4e46SJohan Hedberg 
3082ca9142b8SJohan Hedberg 	return irk;
3083970c4e46SJohan Hedberg }
3084970c4e46SJohan Hedberg 
308555ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
308655ed8ca1SJohan Hedberg {
308755ed8ca1SJohan Hedberg 	struct link_key *key;
308855ed8ca1SJohan Hedberg 
308955ed8ca1SJohan Hedberg 	key = hci_find_link_key(hdev, bdaddr);
309055ed8ca1SJohan Hedberg 	if (!key)
309155ed8ca1SJohan Hedberg 		return -ENOENT;
309255ed8ca1SJohan Hedberg 
30936ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
309455ed8ca1SJohan Hedberg 
309555ed8ca1SJohan Hedberg 	list_del(&key->list);
309655ed8ca1SJohan Hedberg 	kfree(key);
309755ed8ca1SJohan Hedberg 
309855ed8ca1SJohan Hedberg 	return 0;
309955ed8ca1SJohan Hedberg }
310055ed8ca1SJohan Hedberg 
3101e0b2b27eSJohan Hedberg int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
3102b899efafSVinicius Costa Gomes {
3103b899efafSVinicius Costa Gomes 	struct smp_ltk *k, *tmp;
3104c51ffa0bSJohan Hedberg 	int removed = 0;
3105b899efafSVinicius Costa Gomes 
3106b899efafSVinicius Costa Gomes 	list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
3107e0b2b27eSJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type)
3108b899efafSVinicius Costa Gomes 			continue;
3109b899efafSVinicius Costa Gomes 
31106ed93dc6SAndrei Emeltchenko 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
3111b899efafSVinicius Costa Gomes 
3112b899efafSVinicius Costa Gomes 		list_del(&k->list);
3113b899efafSVinicius Costa Gomes 		kfree(k);
3114c51ffa0bSJohan Hedberg 		removed++;
3115b899efafSVinicius Costa Gomes 	}
3116b899efafSVinicius Costa Gomes 
3117c51ffa0bSJohan Hedberg 	return removed ? 0 : -ENOENT;
3118b899efafSVinicius Costa Gomes }
3119b899efafSVinicius Costa Gomes 
3120a7ec7338SJohan Hedberg void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type)
3121a7ec7338SJohan Hedberg {
3122a7ec7338SJohan Hedberg 	struct smp_irk *k, *tmp;
3123a7ec7338SJohan Hedberg 
3124668b7b19SJohan Hedberg 	list_for_each_entry_safe(k, tmp, &hdev->identity_resolving_keys, list) {
3125a7ec7338SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type)
3126a7ec7338SJohan Hedberg 			continue;
3127a7ec7338SJohan Hedberg 
3128a7ec7338SJohan Hedberg 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
3129a7ec7338SJohan Hedberg 
3130a7ec7338SJohan Hedberg 		list_del(&k->list);
3131a7ec7338SJohan Hedberg 		kfree(k);
3132a7ec7338SJohan Hedberg 	}
3133a7ec7338SJohan Hedberg }
3134a7ec7338SJohan Hedberg 
31356bd32326SVille Tervo /* HCI command timer function */
313665cc2b49SMarcel Holtmann static void hci_cmd_timeout(struct work_struct *work)
31376bd32326SVille Tervo {
313865cc2b49SMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev,
313965cc2b49SMarcel Holtmann 					    cmd_timer.work);
31406bd32326SVille Tervo 
3141bda4f23aSAndrei Emeltchenko 	if (hdev->sent_cmd) {
3142bda4f23aSAndrei Emeltchenko 		struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data;
3143bda4f23aSAndrei Emeltchenko 		u16 opcode = __le16_to_cpu(sent->opcode);
3144bda4f23aSAndrei Emeltchenko 
3145bda4f23aSAndrei Emeltchenko 		BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode);
3146bda4f23aSAndrei Emeltchenko 	} else {
31476bd32326SVille Tervo 		BT_ERR("%s command tx timeout", hdev->name);
3148bda4f23aSAndrei Emeltchenko 	}
3149bda4f23aSAndrei Emeltchenko 
31506bd32326SVille Tervo 	atomic_set(&hdev->cmd_cnt, 1);
3151c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
31526bd32326SVille Tervo }
31536bd32326SVille Tervo 
31542763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
31552763eda6SSzymon Janc 					  bdaddr_t *bdaddr)
31562763eda6SSzymon Janc {
31572763eda6SSzymon Janc 	struct oob_data *data;
31582763eda6SSzymon Janc 
31592763eda6SSzymon Janc 	list_for_each_entry(data, &hdev->remote_oob_data, list)
31602763eda6SSzymon Janc 		if (bacmp(bdaddr, &data->bdaddr) == 0)
31612763eda6SSzymon Janc 			return data;
31622763eda6SSzymon Janc 
31632763eda6SSzymon Janc 	return NULL;
31642763eda6SSzymon Janc }
31652763eda6SSzymon Janc 
31662763eda6SSzymon Janc int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr)
31672763eda6SSzymon Janc {
31682763eda6SSzymon Janc 	struct oob_data *data;
31692763eda6SSzymon Janc 
31702763eda6SSzymon Janc 	data = hci_find_remote_oob_data(hdev, bdaddr);
31712763eda6SSzymon Janc 	if (!data)
31722763eda6SSzymon Janc 		return -ENOENT;
31732763eda6SSzymon Janc 
31746ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
31752763eda6SSzymon Janc 
31762763eda6SSzymon Janc 	list_del(&data->list);
31772763eda6SSzymon Janc 	kfree(data);
31782763eda6SSzymon Janc 
31792763eda6SSzymon Janc 	return 0;
31802763eda6SSzymon Janc }
31812763eda6SSzymon Janc 
318235f7498aSJohan Hedberg void hci_remote_oob_data_clear(struct hci_dev *hdev)
31832763eda6SSzymon Janc {
31842763eda6SSzymon Janc 	struct oob_data *data, *n;
31852763eda6SSzymon Janc 
31862763eda6SSzymon Janc 	list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) {
31872763eda6SSzymon Janc 		list_del(&data->list);
31882763eda6SSzymon Janc 		kfree(data);
31892763eda6SSzymon Janc 	}
31902763eda6SSzymon Janc }
31912763eda6SSzymon Janc 
31920798872eSMarcel Holtmann int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
31930798872eSMarcel Holtmann 			    u8 *hash, u8 *randomizer)
31942763eda6SSzymon Janc {
31952763eda6SSzymon Janc 	struct oob_data *data;
31962763eda6SSzymon Janc 
31972763eda6SSzymon Janc 	data = hci_find_remote_oob_data(hdev, bdaddr);
31982763eda6SSzymon Janc 	if (!data) {
31990a14ab41SJohan Hedberg 		data = kmalloc(sizeof(*data), GFP_KERNEL);
32002763eda6SSzymon Janc 		if (!data)
32012763eda6SSzymon Janc 			return -ENOMEM;
32022763eda6SSzymon Janc 
32032763eda6SSzymon Janc 		bacpy(&data->bdaddr, bdaddr);
32042763eda6SSzymon Janc 		list_add(&data->list, &hdev->remote_oob_data);
32052763eda6SSzymon Janc 	}
32062763eda6SSzymon Janc 
3207519ca9d0SMarcel Holtmann 	memcpy(data->hash192, hash, sizeof(data->hash192));
3208519ca9d0SMarcel Holtmann 	memcpy(data->randomizer192, randomizer, sizeof(data->randomizer192));
32092763eda6SSzymon Janc 
32100798872eSMarcel Holtmann 	memset(data->hash256, 0, sizeof(data->hash256));
32110798872eSMarcel Holtmann 	memset(data->randomizer256, 0, sizeof(data->randomizer256));
32120798872eSMarcel Holtmann 
32130798872eSMarcel Holtmann 	BT_DBG("%s for %pMR", hdev->name, bdaddr);
32140798872eSMarcel Holtmann 
32150798872eSMarcel Holtmann 	return 0;
32160798872eSMarcel Holtmann }
32170798872eSMarcel Holtmann 
32180798872eSMarcel Holtmann int hci_add_remote_oob_ext_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
32190798872eSMarcel Holtmann 				u8 *hash192, u8 *randomizer192,
32200798872eSMarcel Holtmann 				u8 *hash256, u8 *randomizer256)
32210798872eSMarcel Holtmann {
32220798872eSMarcel Holtmann 	struct oob_data *data;
32230798872eSMarcel Holtmann 
32240798872eSMarcel Holtmann 	data = hci_find_remote_oob_data(hdev, bdaddr);
32250798872eSMarcel Holtmann 	if (!data) {
32260a14ab41SJohan Hedberg 		data = kmalloc(sizeof(*data), GFP_KERNEL);
32270798872eSMarcel Holtmann 		if (!data)
32280798872eSMarcel Holtmann 			return -ENOMEM;
32290798872eSMarcel Holtmann 
32300798872eSMarcel Holtmann 		bacpy(&data->bdaddr, bdaddr);
32310798872eSMarcel Holtmann 		list_add(&data->list, &hdev->remote_oob_data);
32320798872eSMarcel Holtmann 	}
32330798872eSMarcel Holtmann 
32340798872eSMarcel Holtmann 	memcpy(data->hash192, hash192, sizeof(data->hash192));
32350798872eSMarcel Holtmann 	memcpy(data->randomizer192, randomizer192, sizeof(data->randomizer192));
32360798872eSMarcel Holtmann 
32370798872eSMarcel Holtmann 	memcpy(data->hash256, hash256, sizeof(data->hash256));
32380798872eSMarcel Holtmann 	memcpy(data->randomizer256, randomizer256, sizeof(data->randomizer256));
32390798872eSMarcel Holtmann 
32406ed93dc6SAndrei Emeltchenko 	BT_DBG("%s for %pMR", hdev->name, bdaddr);
32412763eda6SSzymon Janc 
32422763eda6SSzymon Janc 	return 0;
32432763eda6SSzymon Janc }
32442763eda6SSzymon Janc 
3245b9ee0a78SMarcel Holtmann struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
3246b9ee0a78SMarcel Holtmann 					 bdaddr_t *bdaddr, u8 type)
3247b2a66aadSAntti Julku {
3248b2a66aadSAntti Julku 	struct bdaddr_list *b;
3249b2a66aadSAntti Julku 
3250b9ee0a78SMarcel Holtmann 	list_for_each_entry(b, &hdev->blacklist, list) {
3251b9ee0a78SMarcel Holtmann 		if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
3252b2a66aadSAntti Julku 			return b;
3253b9ee0a78SMarcel Holtmann 	}
3254b2a66aadSAntti Julku 
3255b2a66aadSAntti Julku 	return NULL;
3256b2a66aadSAntti Julku }
3257b2a66aadSAntti Julku 
3258c9507490SMarcel Holtmann static void hci_blacklist_clear(struct hci_dev *hdev)
3259b2a66aadSAntti Julku {
3260b2a66aadSAntti Julku 	struct list_head *p, *n;
3261b2a66aadSAntti Julku 
3262b2a66aadSAntti Julku 	list_for_each_safe(p, n, &hdev->blacklist) {
3263b9ee0a78SMarcel Holtmann 		struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list);
3264b2a66aadSAntti Julku 
3265b2a66aadSAntti Julku 		list_del(p);
3266b2a66aadSAntti Julku 		kfree(b);
3267b2a66aadSAntti Julku 	}
3268b2a66aadSAntti Julku }
3269b2a66aadSAntti Julku 
327088c1fe4bSJohan Hedberg int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3271b2a66aadSAntti Julku {
3272b2a66aadSAntti Julku 	struct bdaddr_list *entry;
3273b2a66aadSAntti Julku 
3274b9ee0a78SMarcel Holtmann 	if (!bacmp(bdaddr, BDADDR_ANY))
3275b2a66aadSAntti Julku 		return -EBADF;
3276b2a66aadSAntti Julku 
3277b9ee0a78SMarcel Holtmann 	if (hci_blacklist_lookup(hdev, bdaddr, type))
32785e762444SAntti Julku 		return -EEXIST;
3279b2a66aadSAntti Julku 
3280b2a66aadSAntti Julku 	entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
32815e762444SAntti Julku 	if (!entry)
32825e762444SAntti Julku 		return -ENOMEM;
3283b2a66aadSAntti Julku 
3284b2a66aadSAntti Julku 	bacpy(&entry->bdaddr, bdaddr);
3285b9ee0a78SMarcel Holtmann 	entry->bdaddr_type = type;
3286b2a66aadSAntti Julku 
3287b2a66aadSAntti Julku 	list_add(&entry->list, &hdev->blacklist);
3288b2a66aadSAntti Julku 
328988c1fe4bSJohan Hedberg 	return mgmt_device_blocked(hdev, bdaddr, type);
3290b2a66aadSAntti Julku }
3291b2a66aadSAntti Julku 
329288c1fe4bSJohan Hedberg int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3293b2a66aadSAntti Julku {
3294b2a66aadSAntti Julku 	struct bdaddr_list *entry;
3295b2a66aadSAntti Julku 
329635f7498aSJohan Hedberg 	if (!bacmp(bdaddr, BDADDR_ANY)) {
329735f7498aSJohan Hedberg 		hci_blacklist_clear(hdev);
329835f7498aSJohan Hedberg 		return 0;
329935f7498aSJohan Hedberg 	}
3300b2a66aadSAntti Julku 
3301b9ee0a78SMarcel Holtmann 	entry = hci_blacklist_lookup(hdev, bdaddr, type);
33021ec918ceSSzymon Janc 	if (!entry)
33035e762444SAntti Julku 		return -ENOENT;
3304b2a66aadSAntti Julku 
3305b2a66aadSAntti Julku 	list_del(&entry->list);
3306b2a66aadSAntti Julku 	kfree(entry);
3307b2a66aadSAntti Julku 
330888c1fe4bSJohan Hedberg 	return mgmt_device_unblocked(hdev, bdaddr, type);
3309b2a66aadSAntti Julku }
3310b2a66aadSAntti Julku 
3311d2ab0ac1SMarcel Holtmann struct bdaddr_list *hci_white_list_lookup(struct hci_dev *hdev,
3312d2ab0ac1SMarcel Holtmann 					  bdaddr_t *bdaddr, u8 type)
3313d2ab0ac1SMarcel Holtmann {
3314d2ab0ac1SMarcel Holtmann 	struct bdaddr_list *b;
3315d2ab0ac1SMarcel Holtmann 
3316d2ab0ac1SMarcel Holtmann 	list_for_each_entry(b, &hdev->le_white_list, list) {
3317d2ab0ac1SMarcel Holtmann 		if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
3318d2ab0ac1SMarcel Holtmann 			return b;
3319d2ab0ac1SMarcel Holtmann 	}
3320d2ab0ac1SMarcel Holtmann 
3321d2ab0ac1SMarcel Holtmann 	return NULL;
3322d2ab0ac1SMarcel Holtmann }
3323d2ab0ac1SMarcel Holtmann 
3324d2ab0ac1SMarcel Holtmann void hci_white_list_clear(struct hci_dev *hdev)
3325d2ab0ac1SMarcel Holtmann {
3326d2ab0ac1SMarcel Holtmann 	struct list_head *p, *n;
3327d2ab0ac1SMarcel Holtmann 
3328d2ab0ac1SMarcel Holtmann 	list_for_each_safe(p, n, &hdev->le_white_list) {
3329d2ab0ac1SMarcel Holtmann 		struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list);
3330d2ab0ac1SMarcel Holtmann 
3331d2ab0ac1SMarcel Holtmann 		list_del(p);
3332d2ab0ac1SMarcel Holtmann 		kfree(b);
3333d2ab0ac1SMarcel Holtmann 	}
3334d2ab0ac1SMarcel Holtmann }
3335d2ab0ac1SMarcel Holtmann 
3336d2ab0ac1SMarcel Holtmann int hci_white_list_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3337d2ab0ac1SMarcel Holtmann {
3338d2ab0ac1SMarcel Holtmann 	struct bdaddr_list *entry;
3339d2ab0ac1SMarcel Holtmann 
3340d2ab0ac1SMarcel Holtmann 	if (!bacmp(bdaddr, BDADDR_ANY))
3341d2ab0ac1SMarcel Holtmann 		return -EBADF;
3342d2ab0ac1SMarcel Holtmann 
3343d2ab0ac1SMarcel Holtmann 	entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
3344d2ab0ac1SMarcel Holtmann 	if (!entry)
3345d2ab0ac1SMarcel Holtmann 		return -ENOMEM;
3346d2ab0ac1SMarcel Holtmann 
3347d2ab0ac1SMarcel Holtmann 	bacpy(&entry->bdaddr, bdaddr);
3348d2ab0ac1SMarcel Holtmann 	entry->bdaddr_type = type;
3349d2ab0ac1SMarcel Holtmann 
3350d2ab0ac1SMarcel Holtmann 	list_add(&entry->list, &hdev->le_white_list);
3351d2ab0ac1SMarcel Holtmann 
3352d2ab0ac1SMarcel Holtmann 	return 0;
3353d2ab0ac1SMarcel Holtmann }
3354d2ab0ac1SMarcel Holtmann 
3355d2ab0ac1SMarcel Holtmann int hci_white_list_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3356d2ab0ac1SMarcel Holtmann {
3357d2ab0ac1SMarcel Holtmann 	struct bdaddr_list *entry;
3358d2ab0ac1SMarcel Holtmann 
3359d2ab0ac1SMarcel Holtmann 	if (!bacmp(bdaddr, BDADDR_ANY))
3360d2ab0ac1SMarcel Holtmann 		return -EBADF;
3361d2ab0ac1SMarcel Holtmann 
3362d2ab0ac1SMarcel Holtmann 	entry = hci_white_list_lookup(hdev, bdaddr, type);
3363d2ab0ac1SMarcel Holtmann 	if (!entry)
3364d2ab0ac1SMarcel Holtmann 		return -ENOENT;
3365d2ab0ac1SMarcel Holtmann 
3366d2ab0ac1SMarcel Holtmann 	list_del(&entry->list);
3367d2ab0ac1SMarcel Holtmann 	kfree(entry);
3368d2ab0ac1SMarcel Holtmann 
3369d2ab0ac1SMarcel Holtmann 	return 0;
3370d2ab0ac1SMarcel Holtmann }
3371d2ab0ac1SMarcel Holtmann 
337215819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
337315819a70SAndre Guedes struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
337415819a70SAndre Guedes 					       bdaddr_t *addr, u8 addr_type)
337515819a70SAndre Guedes {
337615819a70SAndre Guedes 	struct hci_conn_params *params;
337715819a70SAndre Guedes 
337815819a70SAndre Guedes 	list_for_each_entry(params, &hdev->le_conn_params, list) {
337915819a70SAndre Guedes 		if (bacmp(&params->addr, addr) == 0 &&
338015819a70SAndre Guedes 		    params->addr_type == addr_type) {
338115819a70SAndre Guedes 			return params;
338215819a70SAndre Guedes 		}
338315819a70SAndre Guedes 	}
338415819a70SAndre Guedes 
338515819a70SAndre Guedes 	return NULL;
338615819a70SAndre Guedes }
338715819a70SAndre Guedes 
3388cef952ceSAndre Guedes static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
3389cef952ceSAndre Guedes {
3390cef952ceSAndre Guedes 	struct hci_conn *conn;
3391cef952ceSAndre Guedes 
3392cef952ceSAndre Guedes 	conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr);
3393cef952ceSAndre Guedes 	if (!conn)
3394cef952ceSAndre Guedes 		return false;
3395cef952ceSAndre Guedes 
3396cef952ceSAndre Guedes 	if (conn->dst_type != type)
3397cef952ceSAndre Guedes 		return false;
3398cef952ceSAndre Guedes 
3399cef952ceSAndre Guedes 	if (conn->state != BT_CONNECTED)
3400cef952ceSAndre Guedes 		return false;
3401cef952ceSAndre Guedes 
3402cef952ceSAndre Guedes 	return true;
3403cef952ceSAndre Guedes }
3404cef952ceSAndre Guedes 
3405a9b0a04cSAndre Guedes static bool is_identity_address(bdaddr_t *addr, u8 addr_type)
3406a9b0a04cSAndre Guedes {
3407a9b0a04cSAndre Guedes 	if (addr_type == ADDR_LE_DEV_PUBLIC)
3408a9b0a04cSAndre Guedes 		return true;
3409a9b0a04cSAndre Guedes 
3410a9b0a04cSAndre Guedes 	/* Check for Random Static address type */
3411a9b0a04cSAndre Guedes 	if ((addr->b[5] & 0xc0) == 0xc0)
3412a9b0a04cSAndre Guedes 		return true;
3413a9b0a04cSAndre Guedes 
3414a9b0a04cSAndre Guedes 	return false;
3415a9b0a04cSAndre Guedes }
3416a9b0a04cSAndre Guedes 
341715819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
34184b10966fSMarcel Holtmann struct bdaddr_list *hci_pend_le_conn_lookup(struct hci_dev *hdev,
34194b10966fSMarcel Holtmann 					    bdaddr_t *addr, u8 addr_type)
34204b10966fSMarcel Holtmann {
34214b10966fSMarcel Holtmann 	struct bdaddr_list *entry;
34224b10966fSMarcel Holtmann 
34234b10966fSMarcel Holtmann 	list_for_each_entry(entry, &hdev->pend_le_conns, list) {
34244b10966fSMarcel Holtmann 		if (bacmp(&entry->bdaddr, addr) == 0 &&
34254b10966fSMarcel Holtmann 		    entry->bdaddr_type == addr_type)
34264b10966fSMarcel Holtmann 			return entry;
34274b10966fSMarcel Holtmann 	}
34284b10966fSMarcel Holtmann 
34294b10966fSMarcel Holtmann 	return NULL;
34304b10966fSMarcel Holtmann }
34314b10966fSMarcel Holtmann 
34324b10966fSMarcel Holtmann /* This function requires the caller holds hdev->lock */
34334b10966fSMarcel Holtmann void hci_pend_le_conn_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
34344b10966fSMarcel Holtmann {
34354b10966fSMarcel Holtmann 	struct bdaddr_list *entry;
34364b10966fSMarcel Holtmann 
34374b10966fSMarcel Holtmann 	entry = hci_pend_le_conn_lookup(hdev, addr, addr_type);
34384b10966fSMarcel Holtmann 	if (entry)
34394b10966fSMarcel Holtmann 		goto done;
34404b10966fSMarcel Holtmann 
34414b10966fSMarcel Holtmann 	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
34424b10966fSMarcel Holtmann 	if (!entry) {
34434b10966fSMarcel Holtmann 		BT_ERR("Out of memory");
34444b10966fSMarcel Holtmann 		return;
34454b10966fSMarcel Holtmann 	}
34464b10966fSMarcel Holtmann 
34474b10966fSMarcel Holtmann 	bacpy(&entry->bdaddr, addr);
34484b10966fSMarcel Holtmann 	entry->bdaddr_type = addr_type;
34494b10966fSMarcel Holtmann 
34504b10966fSMarcel Holtmann 	list_add(&entry->list, &hdev->pend_le_conns);
34514b10966fSMarcel Holtmann 
34524b10966fSMarcel Holtmann 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
34534b10966fSMarcel Holtmann 
34544b10966fSMarcel Holtmann done:
34554b10966fSMarcel Holtmann 	hci_update_background_scan(hdev);
34564b10966fSMarcel Holtmann }
34574b10966fSMarcel Holtmann 
34584b10966fSMarcel Holtmann /* This function requires the caller holds hdev->lock */
34594b10966fSMarcel Holtmann void hci_pend_le_conn_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
34604b10966fSMarcel Holtmann {
34614b10966fSMarcel Holtmann 	struct bdaddr_list *entry;
34624b10966fSMarcel Holtmann 
34634b10966fSMarcel Holtmann 	entry = hci_pend_le_conn_lookup(hdev, addr, addr_type);
34644b10966fSMarcel Holtmann 	if (!entry)
34654b10966fSMarcel Holtmann 		goto done;
34664b10966fSMarcel Holtmann 
34674b10966fSMarcel Holtmann 	list_del(&entry->list);
34684b10966fSMarcel Holtmann 	kfree(entry);
34694b10966fSMarcel Holtmann 
34704b10966fSMarcel Holtmann 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
34714b10966fSMarcel Holtmann 
34724b10966fSMarcel Holtmann done:
34734b10966fSMarcel Holtmann 	hci_update_background_scan(hdev);
34744b10966fSMarcel Holtmann }
34754b10966fSMarcel Holtmann 
34764b10966fSMarcel Holtmann /* This function requires the caller holds hdev->lock */
34774b10966fSMarcel Holtmann void hci_pend_le_conns_clear(struct hci_dev *hdev)
34784b10966fSMarcel Holtmann {
34794b10966fSMarcel Holtmann 	struct bdaddr_list *entry, *tmp;
34804b10966fSMarcel Holtmann 
34814b10966fSMarcel Holtmann 	list_for_each_entry_safe(entry, tmp, &hdev->pend_le_conns, list) {
34824b10966fSMarcel Holtmann 		list_del(&entry->list);
34834b10966fSMarcel Holtmann 		kfree(entry);
34844b10966fSMarcel Holtmann 	}
34854b10966fSMarcel Holtmann 
34864b10966fSMarcel Holtmann 	BT_DBG("All LE pending connections cleared");
34874b10966fSMarcel Holtmann }
34884b10966fSMarcel Holtmann 
34894b10966fSMarcel Holtmann /* This function requires the caller holds hdev->lock */
3490a9b0a04cSAndre Guedes int hci_conn_params_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
34919fcb18efSAndre Guedes 			u8 auto_connect, u16 conn_min_interval,
34929fcb18efSAndre Guedes 			u16 conn_max_interval)
349315819a70SAndre Guedes {
349415819a70SAndre Guedes 	struct hci_conn_params *params;
349515819a70SAndre Guedes 
3496a9b0a04cSAndre Guedes 	if (!is_identity_address(addr, addr_type))
3497a9b0a04cSAndre Guedes 		return -EINVAL;
3498a9b0a04cSAndre Guedes 
349915819a70SAndre Guedes 	params = hci_conn_params_lookup(hdev, addr, addr_type);
3500cef952ceSAndre Guedes 	if (params)
3501cef952ceSAndre Guedes 		goto update;
350215819a70SAndre Guedes 
350315819a70SAndre Guedes 	params = kzalloc(sizeof(*params), GFP_KERNEL);
350415819a70SAndre Guedes 	if (!params) {
350515819a70SAndre Guedes 		BT_ERR("Out of memory");
3506a9b0a04cSAndre Guedes 		return -ENOMEM;
350715819a70SAndre Guedes 	}
350815819a70SAndre Guedes 
350915819a70SAndre Guedes 	bacpy(&params->addr, addr);
351015819a70SAndre Guedes 	params->addr_type = addr_type;
3511cef952ceSAndre Guedes 
3512cef952ceSAndre Guedes 	list_add(&params->list, &hdev->le_conn_params);
3513cef952ceSAndre Guedes 
3514cef952ceSAndre Guedes update:
351515819a70SAndre Guedes 	params->conn_min_interval = conn_min_interval;
351615819a70SAndre Guedes 	params->conn_max_interval = conn_max_interval;
35179fcb18efSAndre Guedes 	params->auto_connect = auto_connect;
351815819a70SAndre Guedes 
3519cef952ceSAndre Guedes 	switch (auto_connect) {
3520cef952ceSAndre Guedes 	case HCI_AUTO_CONN_DISABLED:
3521cef952ceSAndre Guedes 	case HCI_AUTO_CONN_LINK_LOSS:
3522cef952ceSAndre Guedes 		hci_pend_le_conn_del(hdev, addr, addr_type);
3523cef952ceSAndre Guedes 		break;
3524cef952ceSAndre Guedes 	case HCI_AUTO_CONN_ALWAYS:
3525cef952ceSAndre Guedes 		if (!is_connected(hdev, addr, addr_type))
3526cef952ceSAndre Guedes 			hci_pend_le_conn_add(hdev, addr, addr_type);
3527cef952ceSAndre Guedes 		break;
3528cef952ceSAndre Guedes 	}
352915819a70SAndre Guedes 
35309fcb18efSAndre Guedes 	BT_DBG("addr %pMR (type %u) auto_connect %u conn_min_interval 0x%.4x "
35319fcb18efSAndre Guedes 	       "conn_max_interval 0x%.4x", addr, addr_type, auto_connect,
35329fcb18efSAndre Guedes 	       conn_min_interval, conn_max_interval);
3533a9b0a04cSAndre Guedes 
3534a9b0a04cSAndre Guedes 	return 0;
353515819a70SAndre Guedes }
353615819a70SAndre Guedes 
353715819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
353815819a70SAndre Guedes void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
353915819a70SAndre Guedes {
354015819a70SAndre Guedes 	struct hci_conn_params *params;
354115819a70SAndre Guedes 
354215819a70SAndre Guedes 	params = hci_conn_params_lookup(hdev, addr, addr_type);
354315819a70SAndre Guedes 	if (!params)
354415819a70SAndre Guedes 		return;
354515819a70SAndre Guedes 
3546cef952ceSAndre Guedes 	hci_pend_le_conn_del(hdev, addr, addr_type);
3547cef952ceSAndre Guedes 
354815819a70SAndre Guedes 	list_del(&params->list);
354915819a70SAndre Guedes 	kfree(params);
355015819a70SAndre Guedes 
355115819a70SAndre Guedes 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
355215819a70SAndre Guedes }
355315819a70SAndre Guedes 
355415819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
355515819a70SAndre Guedes void hci_conn_params_clear(struct hci_dev *hdev)
355615819a70SAndre Guedes {
355715819a70SAndre Guedes 	struct hci_conn_params *params, *tmp;
355815819a70SAndre Guedes 
355915819a70SAndre Guedes 	list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) {
356015819a70SAndre Guedes 		list_del(&params->list);
356115819a70SAndre Guedes 		kfree(params);
356215819a70SAndre Guedes 	}
356315819a70SAndre Guedes 
356415819a70SAndre Guedes 	BT_DBG("All LE connection parameters were removed");
356515819a70SAndre Guedes }
356615819a70SAndre Guedes 
35674c87eaabSAndre Guedes static void inquiry_complete(struct hci_dev *hdev, u8 status)
35687ba8b4beSAndre Guedes {
35694c87eaabSAndre Guedes 	if (status) {
35704c87eaabSAndre Guedes 		BT_ERR("Failed to start inquiry: status %d", status);
35717ba8b4beSAndre Guedes 
35724c87eaabSAndre Guedes 		hci_dev_lock(hdev);
35734c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
35744c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
35754c87eaabSAndre Guedes 		return;
35764c87eaabSAndre Guedes 	}
35777ba8b4beSAndre Guedes }
35787ba8b4beSAndre Guedes 
35794c87eaabSAndre Guedes static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status)
35807ba8b4beSAndre Guedes {
35814c87eaabSAndre Guedes 	/* General inquiry access code (GIAC) */
35824c87eaabSAndre Guedes 	u8 lap[3] = { 0x33, 0x8b, 0x9e };
35834c87eaabSAndre Guedes 	struct hci_request req;
35844c87eaabSAndre Guedes 	struct hci_cp_inquiry cp;
35857ba8b4beSAndre Guedes 	int err;
35867ba8b4beSAndre Guedes 
35874c87eaabSAndre Guedes 	if (status) {
35884c87eaabSAndre Guedes 		BT_ERR("Failed to disable LE scanning: status %d", status);
35894c87eaabSAndre Guedes 		return;
35907ba8b4beSAndre Guedes 	}
35917ba8b4beSAndre Guedes 
35924c87eaabSAndre Guedes 	switch (hdev->discovery.type) {
35934c87eaabSAndre Guedes 	case DISCOV_TYPE_LE:
35944c87eaabSAndre Guedes 		hci_dev_lock(hdev);
35954c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
35964c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
35974c87eaabSAndre Guedes 		break;
35987dbfac1dSAndre Guedes 
35994c87eaabSAndre Guedes 	case DISCOV_TYPE_INTERLEAVED:
36004c87eaabSAndre Guedes 		hci_req_init(&req, hdev);
36017dbfac1dSAndre Guedes 
36027dbfac1dSAndre Guedes 		memset(&cp, 0, sizeof(cp));
36034c87eaabSAndre Guedes 		memcpy(&cp.lap, lap, sizeof(cp.lap));
36044c87eaabSAndre Guedes 		cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN;
36054c87eaabSAndre Guedes 		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp);
36064c87eaabSAndre Guedes 
36074c87eaabSAndre Guedes 		hci_dev_lock(hdev);
36084c87eaabSAndre Guedes 
36094c87eaabSAndre Guedes 		hci_inquiry_cache_flush(hdev);
36104c87eaabSAndre Guedes 
36114c87eaabSAndre Guedes 		err = hci_req_run(&req, inquiry_complete);
36124c87eaabSAndre Guedes 		if (err) {
36134c87eaabSAndre Guedes 			BT_ERR("Inquiry request failed: err %d", err);
36144c87eaabSAndre Guedes 			hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
36157dbfac1dSAndre Guedes 		}
36167dbfac1dSAndre Guedes 
36174c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
36184c87eaabSAndre Guedes 		break;
36194c87eaabSAndre Guedes 	}
36207dbfac1dSAndre Guedes }
36217dbfac1dSAndre Guedes 
36227ba8b4beSAndre Guedes static void le_scan_disable_work(struct work_struct *work)
36237ba8b4beSAndre Guedes {
36247ba8b4beSAndre Guedes 	struct hci_dev *hdev = container_of(work, struct hci_dev,
36257ba8b4beSAndre Guedes 					    le_scan_disable.work);
36264c87eaabSAndre Guedes 	struct hci_request req;
36274c87eaabSAndre Guedes 	int err;
36287ba8b4beSAndre Guedes 
36297ba8b4beSAndre Guedes 	BT_DBG("%s", hdev->name);
36307ba8b4beSAndre Guedes 
36314c87eaabSAndre Guedes 	hci_req_init(&req, hdev);
36327ba8b4beSAndre Guedes 
3633b1efcc28SAndre Guedes 	hci_req_add_le_scan_disable(&req);
36347ba8b4beSAndre Guedes 
36354c87eaabSAndre Guedes 	err = hci_req_run(&req, le_scan_disable_work_complete);
36364c87eaabSAndre Guedes 	if (err)
36374c87eaabSAndre Guedes 		BT_ERR("Disable LE scanning request failed: err %d", err);
363828b75a89SAndre Guedes }
363928b75a89SAndre Guedes 
36408d97250eSJohan Hedberg static void set_random_addr(struct hci_request *req, bdaddr_t *rpa)
36418d97250eSJohan Hedberg {
36428d97250eSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
36438d97250eSJohan Hedberg 
36448d97250eSJohan Hedberg 	/* If we're advertising or initiating an LE connection we can't
36458d97250eSJohan Hedberg 	 * go ahead and change the random address at this time. This is
36468d97250eSJohan Hedberg 	 * because the eventual initiator address used for the
36478d97250eSJohan Hedberg 	 * subsequently created connection will be undefined (some
36488d97250eSJohan Hedberg 	 * controllers use the new address and others the one we had
36498d97250eSJohan Hedberg 	 * when the operation started).
36508d97250eSJohan Hedberg 	 *
36518d97250eSJohan Hedberg 	 * In this kind of scenario skip the update and let the random
36528d97250eSJohan Hedberg 	 * address be updated at the next cycle.
36538d97250eSJohan Hedberg 	 */
36548d97250eSJohan Hedberg 	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags) ||
36558d97250eSJohan Hedberg 	    hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT)) {
36568d97250eSJohan Hedberg 		BT_DBG("Deferring random address update");
36578d97250eSJohan Hedberg 		return;
36588d97250eSJohan Hedberg 	}
36598d97250eSJohan Hedberg 
36608d97250eSJohan Hedberg 	hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6, rpa);
36618d97250eSJohan Hedberg }
36628d97250eSJohan Hedberg 
366394b1fc92SMarcel Holtmann int hci_update_random_address(struct hci_request *req, bool require_privacy,
366494b1fc92SMarcel Holtmann 			      u8 *own_addr_type)
3665ebd3a747SJohan Hedberg {
3666ebd3a747SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
3667ebd3a747SJohan Hedberg 	int err;
3668ebd3a747SJohan Hedberg 
3669ebd3a747SJohan Hedberg 	/* If privacy is enabled use a resolvable private address. If
36702b5224dcSMarcel Holtmann 	 * current RPA has expired or there is something else than
36712b5224dcSMarcel Holtmann 	 * the current RPA in use, then generate a new one.
3672ebd3a747SJohan Hedberg 	 */
3673ebd3a747SJohan Hedberg 	if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
3674ebd3a747SJohan Hedberg 		int to;
3675ebd3a747SJohan Hedberg 
3676ebd3a747SJohan Hedberg 		*own_addr_type = ADDR_LE_DEV_RANDOM;
3677ebd3a747SJohan Hedberg 
3678ebd3a747SJohan Hedberg 		if (!test_and_clear_bit(HCI_RPA_EXPIRED, &hdev->dev_flags) &&
36792b5224dcSMarcel Holtmann 		    !bacmp(&hdev->random_addr, &hdev->rpa))
3680ebd3a747SJohan Hedberg 			return 0;
3681ebd3a747SJohan Hedberg 
36822b5224dcSMarcel Holtmann 		err = smp_generate_rpa(hdev->tfm_aes, hdev->irk, &hdev->rpa);
3683ebd3a747SJohan Hedberg 		if (err < 0) {
3684ebd3a747SJohan Hedberg 			BT_ERR("%s failed to generate new RPA", hdev->name);
3685ebd3a747SJohan Hedberg 			return err;
3686ebd3a747SJohan Hedberg 		}
3687ebd3a747SJohan Hedberg 
36888d97250eSJohan Hedberg 		set_random_addr(req, &hdev->rpa);
3689ebd3a747SJohan Hedberg 
3690ebd3a747SJohan Hedberg 		to = msecs_to_jiffies(hdev->rpa_timeout * 1000);
3691ebd3a747SJohan Hedberg 		queue_delayed_work(hdev->workqueue, &hdev->rpa_expired, to);
3692ebd3a747SJohan Hedberg 
3693ebd3a747SJohan Hedberg 		return 0;
3694ebd3a747SJohan Hedberg 	}
3695ebd3a747SJohan Hedberg 
369694b1fc92SMarcel Holtmann 	/* In case of required privacy without resolvable private address,
369794b1fc92SMarcel Holtmann 	 * use an unresolvable private address. This is useful for active
369894b1fc92SMarcel Holtmann 	 * scanning and non-connectable advertising.
369994b1fc92SMarcel Holtmann 	 */
370094b1fc92SMarcel Holtmann 	if (require_privacy) {
370194b1fc92SMarcel Holtmann 		bdaddr_t urpa;
370294b1fc92SMarcel Holtmann 
370394b1fc92SMarcel Holtmann 		get_random_bytes(&urpa, 6);
370494b1fc92SMarcel Holtmann 		urpa.b[5] &= 0x3f;	/* Clear two most significant bits */
370594b1fc92SMarcel Holtmann 
370694b1fc92SMarcel Holtmann 		*own_addr_type = ADDR_LE_DEV_RANDOM;
37078d97250eSJohan Hedberg 		set_random_addr(req, &urpa);
370894b1fc92SMarcel Holtmann 		return 0;
370994b1fc92SMarcel Holtmann 	}
371094b1fc92SMarcel Holtmann 
3711ebd3a747SJohan Hedberg 	/* If forcing static address is in use or there is no public
3712ebd3a747SJohan Hedberg 	 * address use the static address as random address (but skip
3713ebd3a747SJohan Hedberg 	 * the HCI command if the current random address is already the
3714ebd3a747SJohan Hedberg 	 * static one.
3715ebd3a747SJohan Hedberg 	 */
3716111902f7SMarcel Holtmann 	if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ||
3717ebd3a747SJohan Hedberg 	    !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
3718ebd3a747SJohan Hedberg 		*own_addr_type = ADDR_LE_DEV_RANDOM;
3719ebd3a747SJohan Hedberg 		if (bacmp(&hdev->static_addr, &hdev->random_addr))
3720ebd3a747SJohan Hedberg 			hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
3721ebd3a747SJohan Hedberg 				    &hdev->static_addr);
3722ebd3a747SJohan Hedberg 		return 0;
3723ebd3a747SJohan Hedberg 	}
3724ebd3a747SJohan Hedberg 
3725ebd3a747SJohan Hedberg 	/* Neither privacy nor static address is being used so use a
3726ebd3a747SJohan Hedberg 	 * public address.
3727ebd3a747SJohan Hedberg 	 */
3728ebd3a747SJohan Hedberg 	*own_addr_type = ADDR_LE_DEV_PUBLIC;
3729ebd3a747SJohan Hedberg 
3730ebd3a747SJohan Hedberg 	return 0;
3731ebd3a747SJohan Hedberg }
3732ebd3a747SJohan Hedberg 
3733a1f4c318SJohan Hedberg /* Copy the Identity Address of the controller.
3734a1f4c318SJohan Hedberg  *
3735a1f4c318SJohan Hedberg  * If the controller has a public BD_ADDR, then by default use that one.
3736a1f4c318SJohan Hedberg  * If this is a LE only controller without a public address, default to
3737a1f4c318SJohan Hedberg  * the static random address.
3738a1f4c318SJohan Hedberg  *
3739a1f4c318SJohan Hedberg  * For debugging purposes it is possible to force controllers with a
3740a1f4c318SJohan Hedberg  * public address to use the static random address instead.
3741a1f4c318SJohan Hedberg  */
3742a1f4c318SJohan Hedberg void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
3743a1f4c318SJohan Hedberg 			       u8 *bdaddr_type)
3744a1f4c318SJohan Hedberg {
3745111902f7SMarcel Holtmann 	if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ||
3746a1f4c318SJohan Hedberg 	    !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
3747a1f4c318SJohan Hedberg 		bacpy(bdaddr, &hdev->static_addr);
3748a1f4c318SJohan Hedberg 		*bdaddr_type = ADDR_LE_DEV_RANDOM;
3749a1f4c318SJohan Hedberg 	} else {
3750a1f4c318SJohan Hedberg 		bacpy(bdaddr, &hdev->bdaddr);
3751a1f4c318SJohan Hedberg 		*bdaddr_type = ADDR_LE_DEV_PUBLIC;
3752a1f4c318SJohan Hedberg 	}
3753a1f4c318SJohan Hedberg }
3754a1f4c318SJohan Hedberg 
37559be0dab7SDavid Herrmann /* Alloc HCI device */
37569be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void)
37579be0dab7SDavid Herrmann {
37589be0dab7SDavid Herrmann 	struct hci_dev *hdev;
37599be0dab7SDavid Herrmann 
37609be0dab7SDavid Herrmann 	hdev = kzalloc(sizeof(struct hci_dev), GFP_KERNEL);
37619be0dab7SDavid Herrmann 	if (!hdev)
37629be0dab7SDavid Herrmann 		return NULL;
37639be0dab7SDavid Herrmann 
3764b1b813d4SDavid Herrmann 	hdev->pkt_type  = (HCI_DM1 | HCI_DH1 | HCI_HV1);
3765b1b813d4SDavid Herrmann 	hdev->esco_type = (ESCO_HV1);
3766b1b813d4SDavid Herrmann 	hdev->link_mode = (HCI_LM_ACCEPT);
3767b4cb9fb2SMarcel Holtmann 	hdev->num_iac = 0x01;		/* One IAC support is mandatory */
3768b1b813d4SDavid Herrmann 	hdev->io_capability = 0x03;	/* No Input No Output */
3769bbaf444aSJohan Hedberg 	hdev->inq_tx_power = HCI_TX_POWER_INVALID;
3770bbaf444aSJohan Hedberg 	hdev->adv_tx_power = HCI_TX_POWER_INVALID;
3771b1b813d4SDavid Herrmann 
3772b1b813d4SDavid Herrmann 	hdev->sniff_max_interval = 800;
3773b1b813d4SDavid Herrmann 	hdev->sniff_min_interval = 80;
3774b1b813d4SDavid Herrmann 
37753f959d46SMarcel Holtmann 	hdev->le_adv_channel_map = 0x07;
3776bef64738SMarcel Holtmann 	hdev->le_scan_interval = 0x0060;
3777bef64738SMarcel Holtmann 	hdev->le_scan_window = 0x0030;
37784e70c7e7SMarcel Holtmann 	hdev->le_conn_min_interval = 0x0028;
37794e70c7e7SMarcel Holtmann 	hdev->le_conn_max_interval = 0x0038;
3780bef64738SMarcel Holtmann 
3781d6bfd59cSJohan Hedberg 	hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT;
3782b9a7a61eSLukasz Rymanowski 	hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT;
378331ad1691SAndrzej Kaczmarek 	hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE;
378431ad1691SAndrzej Kaczmarek 	hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE;
3785d6bfd59cSJohan Hedberg 
3786b1b813d4SDavid Herrmann 	mutex_init(&hdev->lock);
3787b1b813d4SDavid Herrmann 	mutex_init(&hdev->req_lock);
3788b1b813d4SDavid Herrmann 
3789b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->mgmt_pending);
3790b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->blacklist);
3791b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->uuids);
3792b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->link_keys);
3793b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->long_term_keys);
3794970c4e46SJohan Hedberg 	INIT_LIST_HEAD(&hdev->identity_resolving_keys);
3795b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->remote_oob_data);
3796d2ab0ac1SMarcel Holtmann 	INIT_LIST_HEAD(&hdev->le_white_list);
379715819a70SAndre Guedes 	INIT_LIST_HEAD(&hdev->le_conn_params);
379877a77a30SAndre Guedes 	INIT_LIST_HEAD(&hdev->pend_le_conns);
37996b536b5eSAndrei Emeltchenko 	INIT_LIST_HEAD(&hdev->conn_hash.list);
3800b1b813d4SDavid Herrmann 
3801b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->rx_work, hci_rx_work);
3802b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->cmd_work, hci_cmd_work);
3803b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->tx_work, hci_tx_work);
3804b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->power_on, hci_power_on);
3805b1b813d4SDavid Herrmann 
3806b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
3807b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off);
3808b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
3809b1b813d4SDavid Herrmann 
3810b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->rx_q);
3811b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->cmd_q);
3812b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->raw_q);
3813b1b813d4SDavid Herrmann 
3814b1b813d4SDavid Herrmann 	init_waitqueue_head(&hdev->req_wait_q);
3815b1b813d4SDavid Herrmann 
381665cc2b49SMarcel Holtmann 	INIT_DELAYED_WORK(&hdev->cmd_timer, hci_cmd_timeout);
3817b1b813d4SDavid Herrmann 
3818b1b813d4SDavid Herrmann 	hci_init_sysfs(hdev);
3819b1b813d4SDavid Herrmann 	discovery_init(hdev);
38209be0dab7SDavid Herrmann 
38219be0dab7SDavid Herrmann 	return hdev;
38229be0dab7SDavid Herrmann }
38239be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev);
38249be0dab7SDavid Herrmann 
38259be0dab7SDavid Herrmann /* Free HCI device */
38269be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev)
38279be0dab7SDavid Herrmann {
38289be0dab7SDavid Herrmann 	/* will free via device release */
38299be0dab7SDavid Herrmann 	put_device(&hdev->dev);
38309be0dab7SDavid Herrmann }
38319be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev);
38329be0dab7SDavid Herrmann 
38331da177e4SLinus Torvalds /* Register HCI device */
38341da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev)
38351da177e4SLinus Torvalds {
3836b1b813d4SDavid Herrmann 	int id, error;
38371da177e4SLinus Torvalds 
3838010666a1SDavid Herrmann 	if (!hdev->open || !hdev->close)
38391da177e4SLinus Torvalds 		return -EINVAL;
38401da177e4SLinus Torvalds 
384108add513SMat Martineau 	/* Do not allow HCI_AMP devices to register at index 0,
384208add513SMat Martineau 	 * so the index can be used as the AMP controller ID.
384308add513SMat Martineau 	 */
38443df92b31SSasha Levin 	switch (hdev->dev_type) {
38453df92b31SSasha Levin 	case HCI_BREDR:
38463df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL);
38471da177e4SLinus Torvalds 		break;
38483df92b31SSasha Levin 	case HCI_AMP:
38493df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL);
38503df92b31SSasha Levin 		break;
38513df92b31SSasha Levin 	default:
38523df92b31SSasha Levin 		return -EINVAL;
38531da177e4SLinus Torvalds 	}
38541da177e4SLinus Torvalds 
38553df92b31SSasha Levin 	if (id < 0)
38563df92b31SSasha Levin 		return id;
38573df92b31SSasha Levin 
38581da177e4SLinus Torvalds 	sprintf(hdev->name, "hci%d", id);
38591da177e4SLinus Torvalds 	hdev->id = id;
38602d8b3a11SAndrei Emeltchenko 
38612d8b3a11SAndrei Emeltchenko 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
38622d8b3a11SAndrei Emeltchenko 
3863d8537548SKees Cook 	hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
3864d8537548SKees Cook 					  WQ_MEM_RECLAIM, 1, hdev->name);
386533ca954dSDavid Herrmann 	if (!hdev->workqueue) {
386633ca954dSDavid Herrmann 		error = -ENOMEM;
386733ca954dSDavid Herrmann 		goto err;
386833ca954dSDavid Herrmann 	}
3869f48fd9c8SMarcel Holtmann 
3870d8537548SKees Cook 	hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
3871d8537548SKees Cook 					      WQ_MEM_RECLAIM, 1, hdev->name);
38726ead1bbcSJohan Hedberg 	if (!hdev->req_workqueue) {
38736ead1bbcSJohan Hedberg 		destroy_workqueue(hdev->workqueue);
38746ead1bbcSJohan Hedberg 		error = -ENOMEM;
38756ead1bbcSJohan Hedberg 		goto err;
38766ead1bbcSJohan Hedberg 	}
38776ead1bbcSJohan Hedberg 
38780153e2ecSMarcel Holtmann 	if (!IS_ERR_OR_NULL(bt_debugfs))
38790153e2ecSMarcel Holtmann 		hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
38800153e2ecSMarcel Holtmann 
3881bdc3e0f1SMarcel Holtmann 	dev_set_name(&hdev->dev, "%s", hdev->name);
3882bdc3e0f1SMarcel Holtmann 
388399780a7bSJohan Hedberg 	hdev->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0,
388499780a7bSJohan Hedberg 					       CRYPTO_ALG_ASYNC);
388599780a7bSJohan Hedberg 	if (IS_ERR(hdev->tfm_aes)) {
388699780a7bSJohan Hedberg 		BT_ERR("Unable to create crypto context");
388799780a7bSJohan Hedberg 		error = PTR_ERR(hdev->tfm_aes);
388899780a7bSJohan Hedberg 		hdev->tfm_aes = NULL;
388999780a7bSJohan Hedberg 		goto err_wqueue;
389099780a7bSJohan Hedberg 	}
389199780a7bSJohan Hedberg 
3892bdc3e0f1SMarcel Holtmann 	error = device_add(&hdev->dev);
389333ca954dSDavid Herrmann 	if (error < 0)
389499780a7bSJohan Hedberg 		goto err_tfm;
38951da177e4SLinus Torvalds 
3896611b30f7SMarcel Holtmann 	hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev,
3897a8c5fb1aSGustavo Padovan 				    RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops,
3898a8c5fb1aSGustavo Padovan 				    hdev);
3899611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
3900611b30f7SMarcel Holtmann 		if (rfkill_register(hdev->rfkill) < 0) {
3901611b30f7SMarcel Holtmann 			rfkill_destroy(hdev->rfkill);
3902611b30f7SMarcel Holtmann 			hdev->rfkill = NULL;
3903611b30f7SMarcel Holtmann 		}
3904611b30f7SMarcel Holtmann 	}
3905611b30f7SMarcel Holtmann 
39065e130367SJohan Hedberg 	if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
39075e130367SJohan Hedberg 		set_bit(HCI_RFKILLED, &hdev->dev_flags);
39085e130367SJohan Hedberg 
3909a8b2d5c2SJohan Hedberg 	set_bit(HCI_SETUP, &hdev->dev_flags);
3910004b0258SMarcel Holtmann 	set_bit(HCI_AUTO_OFF, &hdev->dev_flags);
3911ce2be9acSAndrei Emeltchenko 
391201cd3404SMarcel Holtmann 	if (hdev->dev_type == HCI_BREDR) {
391356f87901SJohan Hedberg 		/* Assume BR/EDR support until proven otherwise (such as
391456f87901SJohan Hedberg 		 * through reading supported features during init.
391556f87901SJohan Hedberg 		 */
391656f87901SJohan Hedberg 		set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
391756f87901SJohan Hedberg 	}
3918ce2be9acSAndrei Emeltchenko 
3919fcee3377SGustavo Padovan 	write_lock(&hci_dev_list_lock);
3920fcee3377SGustavo Padovan 	list_add(&hdev->list, &hci_dev_list);
3921fcee3377SGustavo Padovan 	write_unlock(&hci_dev_list_lock);
3922fcee3377SGustavo Padovan 
3923fee746b0SMarcel Holtmann 	/* Devices that are marked for raw-only usage need to set
3924fee746b0SMarcel Holtmann 	 * the HCI_RAW flag to indicate that only user channel is
3925fee746b0SMarcel Holtmann 	 * supported.
3926fee746b0SMarcel Holtmann 	 */
3927fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
3928fee746b0SMarcel Holtmann 		set_bit(HCI_RAW, &hdev->flags);
3929fee746b0SMarcel Holtmann 
39301da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_REG);
3931dc946bd8SDavid Herrmann 	hci_dev_hold(hdev);
39321da177e4SLinus Torvalds 
393319202573SJohan Hedberg 	queue_work(hdev->req_workqueue, &hdev->power_on);
3934fbe96d6fSMarcel Holtmann 
39351da177e4SLinus Torvalds 	return id;
3936f48fd9c8SMarcel Holtmann 
393799780a7bSJohan Hedberg err_tfm:
393899780a7bSJohan Hedberg 	crypto_free_blkcipher(hdev->tfm_aes);
393933ca954dSDavid Herrmann err_wqueue:
394033ca954dSDavid Herrmann 	destroy_workqueue(hdev->workqueue);
39416ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
394233ca954dSDavid Herrmann err:
39433df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, hdev->id);
3944f48fd9c8SMarcel Holtmann 
394533ca954dSDavid Herrmann 	return error;
39461da177e4SLinus Torvalds }
39471da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev);
39481da177e4SLinus Torvalds 
39491da177e4SLinus Torvalds /* Unregister HCI device */
395059735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev)
39511da177e4SLinus Torvalds {
39523df92b31SSasha Levin 	int i, id;
3953ef222013SMarcel Holtmann 
3954c13854ceSMarcel Holtmann 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
39551da177e4SLinus Torvalds 
395694324962SJohan Hovold 	set_bit(HCI_UNREGISTER, &hdev->dev_flags);
395794324962SJohan Hovold 
39583df92b31SSasha Levin 	id = hdev->id;
39593df92b31SSasha Levin 
3960f20d09d5SGustavo F. Padovan 	write_lock(&hci_dev_list_lock);
39611da177e4SLinus Torvalds 	list_del(&hdev->list);
3962f20d09d5SGustavo F. Padovan 	write_unlock(&hci_dev_list_lock);
39631da177e4SLinus Torvalds 
39641da177e4SLinus Torvalds 	hci_dev_do_close(hdev);
39651da177e4SLinus Torvalds 
3966cd4c5391SSuraj Sumangala 	for (i = 0; i < NUM_REASSEMBLY; i++)
3967ef222013SMarcel Holtmann 		kfree_skb(hdev->reassembly[i]);
3968ef222013SMarcel Holtmann 
3969b9b5ef18SGustavo Padovan 	cancel_work_sync(&hdev->power_on);
3970b9b5ef18SGustavo Padovan 
3971ab81cbf9SJohan Hedberg 	if (!test_bit(HCI_INIT, &hdev->flags) &&
3972fee746b0SMarcel Holtmann 	    !test_bit(HCI_SETUP, &hdev->dev_flags) &&
3973fee746b0SMarcel Holtmann 	    !test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) {
397409fd0de5SGustavo F. Padovan 		hci_dev_lock(hdev);
3975744cf19eSJohan Hedberg 		mgmt_index_removed(hdev);
397609fd0de5SGustavo F. Padovan 		hci_dev_unlock(hdev);
397756e5cb86SJohan Hedberg 	}
3978ab81cbf9SJohan Hedberg 
39792e58ef3eSJohan Hedberg 	/* mgmt_index_removed should take care of emptying the
39802e58ef3eSJohan Hedberg 	 * pending list */
39812e58ef3eSJohan Hedberg 	BUG_ON(!list_empty(&hdev->mgmt_pending));
39822e58ef3eSJohan Hedberg 
39831da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_UNREG);
39841da177e4SLinus Torvalds 
3985611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
3986611b30f7SMarcel Holtmann 		rfkill_unregister(hdev->rfkill);
3987611b30f7SMarcel Holtmann 		rfkill_destroy(hdev->rfkill);
3988611b30f7SMarcel Holtmann 	}
3989611b30f7SMarcel Holtmann 
399099780a7bSJohan Hedberg 	if (hdev->tfm_aes)
399199780a7bSJohan Hedberg 		crypto_free_blkcipher(hdev->tfm_aes);
399299780a7bSJohan Hedberg 
3993bdc3e0f1SMarcel Holtmann 	device_del(&hdev->dev);
3994147e2d59SDave Young 
39950153e2ecSMarcel Holtmann 	debugfs_remove_recursive(hdev->debugfs);
39960153e2ecSMarcel Holtmann 
3997f48fd9c8SMarcel Holtmann 	destroy_workqueue(hdev->workqueue);
39986ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
3999f48fd9c8SMarcel Holtmann 
400009fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
4001e2e0cacbSJohan Hedberg 	hci_blacklist_clear(hdev);
40022aeb9a1aSJohan Hedberg 	hci_uuids_clear(hdev);
400355ed8ca1SJohan Hedberg 	hci_link_keys_clear(hdev);
4004b899efafSVinicius Costa Gomes 	hci_smp_ltks_clear(hdev);
4005970c4e46SJohan Hedberg 	hci_smp_irks_clear(hdev);
40062763eda6SSzymon Janc 	hci_remote_oob_data_clear(hdev);
4007d2ab0ac1SMarcel Holtmann 	hci_white_list_clear(hdev);
400815819a70SAndre Guedes 	hci_conn_params_clear(hdev);
400977a77a30SAndre Guedes 	hci_pend_le_conns_clear(hdev);
401009fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
4011e2e0cacbSJohan Hedberg 
4012dc946bd8SDavid Herrmann 	hci_dev_put(hdev);
40133df92b31SSasha Levin 
40143df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, id);
40151da177e4SLinus Torvalds }
40161da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev);
40171da177e4SLinus Torvalds 
40181da177e4SLinus Torvalds /* Suspend HCI device */
40191da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev)
40201da177e4SLinus Torvalds {
40211da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_SUSPEND);
40221da177e4SLinus Torvalds 	return 0;
40231da177e4SLinus Torvalds }
40241da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev);
40251da177e4SLinus Torvalds 
40261da177e4SLinus Torvalds /* Resume HCI device */
40271da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev)
40281da177e4SLinus Torvalds {
40291da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_RESUME);
40301da177e4SLinus Torvalds 	return 0;
40311da177e4SLinus Torvalds }
40321da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev);
40331da177e4SLinus Torvalds 
403476bca880SMarcel Holtmann /* Receive frame from HCI drivers */
4035e1a26170SMarcel Holtmann int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
403676bca880SMarcel Holtmann {
403776bca880SMarcel Holtmann 	if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
403876bca880SMarcel Holtmann 		      && !test_bit(HCI_INIT, &hdev->flags))) {
403976bca880SMarcel Holtmann 		kfree_skb(skb);
404076bca880SMarcel Holtmann 		return -ENXIO;
404176bca880SMarcel Holtmann 	}
404276bca880SMarcel Holtmann 
4043d82603c6SJorrit Schippers 	/* Incoming skb */
404476bca880SMarcel Holtmann 	bt_cb(skb)->incoming = 1;
404576bca880SMarcel Holtmann 
404676bca880SMarcel Holtmann 	/* Time stamp */
404776bca880SMarcel Holtmann 	__net_timestamp(skb);
404876bca880SMarcel Holtmann 
404976bca880SMarcel Holtmann 	skb_queue_tail(&hdev->rx_q, skb);
4050b78752ccSMarcel Holtmann 	queue_work(hdev->workqueue, &hdev->rx_work);
4051c78ae283SMarcel Holtmann 
405276bca880SMarcel Holtmann 	return 0;
405376bca880SMarcel Holtmann }
405476bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame);
405576bca880SMarcel Holtmann 
405633e882a5SSuraj Sumangala static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
40571e429f38SGustavo F. Padovan 			  int count, __u8 index)
405833e882a5SSuraj Sumangala {
405933e882a5SSuraj Sumangala 	int len = 0;
406033e882a5SSuraj Sumangala 	int hlen = 0;
406133e882a5SSuraj Sumangala 	int remain = count;
406233e882a5SSuraj Sumangala 	struct sk_buff *skb;
406333e882a5SSuraj Sumangala 	struct bt_skb_cb *scb;
406433e882a5SSuraj Sumangala 
406533e882a5SSuraj Sumangala 	if ((type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT) ||
406633e882a5SSuraj Sumangala 	    index >= NUM_REASSEMBLY)
406733e882a5SSuraj Sumangala 		return -EILSEQ;
406833e882a5SSuraj Sumangala 
406933e882a5SSuraj Sumangala 	skb = hdev->reassembly[index];
407033e882a5SSuraj Sumangala 
407133e882a5SSuraj Sumangala 	if (!skb) {
407233e882a5SSuraj Sumangala 		switch (type) {
407333e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
407433e882a5SSuraj Sumangala 			len = HCI_MAX_FRAME_SIZE;
407533e882a5SSuraj Sumangala 			hlen = HCI_ACL_HDR_SIZE;
407633e882a5SSuraj Sumangala 			break;
407733e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
407833e882a5SSuraj Sumangala 			len = HCI_MAX_EVENT_SIZE;
407933e882a5SSuraj Sumangala 			hlen = HCI_EVENT_HDR_SIZE;
408033e882a5SSuraj Sumangala 			break;
408133e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
408233e882a5SSuraj Sumangala 			len = HCI_MAX_SCO_SIZE;
408333e882a5SSuraj Sumangala 			hlen = HCI_SCO_HDR_SIZE;
408433e882a5SSuraj Sumangala 			break;
408533e882a5SSuraj Sumangala 		}
408633e882a5SSuraj Sumangala 
40871e429f38SGustavo F. Padovan 		skb = bt_skb_alloc(len, GFP_ATOMIC);
408833e882a5SSuraj Sumangala 		if (!skb)
408933e882a5SSuraj Sumangala 			return -ENOMEM;
409033e882a5SSuraj Sumangala 
409133e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
409233e882a5SSuraj Sumangala 		scb->expect = hlen;
409333e882a5SSuraj Sumangala 		scb->pkt_type = type;
409433e882a5SSuraj Sumangala 
409533e882a5SSuraj Sumangala 		hdev->reassembly[index] = skb;
409633e882a5SSuraj Sumangala 	}
409733e882a5SSuraj Sumangala 
409833e882a5SSuraj Sumangala 	while (count) {
409933e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
410089bb46d0SDan Carpenter 		len = min_t(uint, scb->expect, count);
410133e882a5SSuraj Sumangala 
410233e882a5SSuraj Sumangala 		memcpy(skb_put(skb, len), data, len);
410333e882a5SSuraj Sumangala 
410433e882a5SSuraj Sumangala 		count -= len;
410533e882a5SSuraj Sumangala 		data += len;
410633e882a5SSuraj Sumangala 		scb->expect -= len;
410733e882a5SSuraj Sumangala 		remain = count;
410833e882a5SSuraj Sumangala 
410933e882a5SSuraj Sumangala 		switch (type) {
411033e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
411133e882a5SSuraj Sumangala 			if (skb->len == HCI_EVENT_HDR_SIZE) {
411233e882a5SSuraj Sumangala 				struct hci_event_hdr *h = hci_event_hdr(skb);
411333e882a5SSuraj Sumangala 				scb->expect = h->plen;
411433e882a5SSuraj Sumangala 
411533e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
411633e882a5SSuraj Sumangala 					kfree_skb(skb);
411733e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
411833e882a5SSuraj Sumangala 					return -ENOMEM;
411933e882a5SSuraj Sumangala 				}
412033e882a5SSuraj Sumangala 			}
412133e882a5SSuraj Sumangala 			break;
412233e882a5SSuraj Sumangala 
412333e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
412433e882a5SSuraj Sumangala 			if (skb->len  == HCI_ACL_HDR_SIZE) {
412533e882a5SSuraj Sumangala 				struct hci_acl_hdr *h = hci_acl_hdr(skb);
412633e882a5SSuraj Sumangala 				scb->expect = __le16_to_cpu(h->dlen);
412733e882a5SSuraj Sumangala 
412833e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
412933e882a5SSuraj Sumangala 					kfree_skb(skb);
413033e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
413133e882a5SSuraj Sumangala 					return -ENOMEM;
413233e882a5SSuraj Sumangala 				}
413333e882a5SSuraj Sumangala 			}
413433e882a5SSuraj Sumangala 			break;
413533e882a5SSuraj Sumangala 
413633e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
413733e882a5SSuraj Sumangala 			if (skb->len == HCI_SCO_HDR_SIZE) {
413833e882a5SSuraj Sumangala 				struct hci_sco_hdr *h = hci_sco_hdr(skb);
413933e882a5SSuraj Sumangala 				scb->expect = h->dlen;
414033e882a5SSuraj Sumangala 
414133e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
414233e882a5SSuraj Sumangala 					kfree_skb(skb);
414333e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
414433e882a5SSuraj Sumangala 					return -ENOMEM;
414533e882a5SSuraj Sumangala 				}
414633e882a5SSuraj Sumangala 			}
414733e882a5SSuraj Sumangala 			break;
414833e882a5SSuraj Sumangala 		}
414933e882a5SSuraj Sumangala 
415033e882a5SSuraj Sumangala 		if (scb->expect == 0) {
415133e882a5SSuraj Sumangala 			/* Complete frame */
415233e882a5SSuraj Sumangala 
415333e882a5SSuraj Sumangala 			bt_cb(skb)->pkt_type = type;
4154e1a26170SMarcel Holtmann 			hci_recv_frame(hdev, skb);
415533e882a5SSuraj Sumangala 
415633e882a5SSuraj Sumangala 			hdev->reassembly[index] = NULL;
415733e882a5SSuraj Sumangala 			return remain;
415833e882a5SSuraj Sumangala 		}
415933e882a5SSuraj Sumangala 	}
416033e882a5SSuraj Sumangala 
416133e882a5SSuraj Sumangala 	return remain;
416233e882a5SSuraj Sumangala }
416333e882a5SSuraj Sumangala 
4164ef222013SMarcel Holtmann int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
4165ef222013SMarcel Holtmann {
4166f39a3c06SSuraj Sumangala 	int rem = 0;
4167f39a3c06SSuraj Sumangala 
4168ef222013SMarcel Holtmann 	if (type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT)
4169ef222013SMarcel Holtmann 		return -EILSEQ;
4170ef222013SMarcel Holtmann 
4171da5f6c37SGustavo F. Padovan 	while (count) {
41721e429f38SGustavo F. Padovan 		rem = hci_reassembly(hdev, type, data, count, type - 1);
4173f39a3c06SSuraj Sumangala 		if (rem < 0)
4174f39a3c06SSuraj Sumangala 			return rem;
4175ef222013SMarcel Holtmann 
4176f39a3c06SSuraj Sumangala 		data += (count - rem);
4177f39a3c06SSuraj Sumangala 		count = rem;
4178f81c6224SJoe Perches 	}
4179ef222013SMarcel Holtmann 
4180f39a3c06SSuraj Sumangala 	return rem;
4181ef222013SMarcel Holtmann }
4182ef222013SMarcel Holtmann EXPORT_SYMBOL(hci_recv_fragment);
4183ef222013SMarcel Holtmann 
418499811510SSuraj Sumangala #define STREAM_REASSEMBLY 0
418599811510SSuraj Sumangala 
418699811510SSuraj Sumangala int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count)
418799811510SSuraj Sumangala {
418899811510SSuraj Sumangala 	int type;
418999811510SSuraj Sumangala 	int rem = 0;
419099811510SSuraj Sumangala 
4191da5f6c37SGustavo F. Padovan 	while (count) {
419299811510SSuraj Sumangala 		struct sk_buff *skb = hdev->reassembly[STREAM_REASSEMBLY];
419399811510SSuraj Sumangala 
419499811510SSuraj Sumangala 		if (!skb) {
419599811510SSuraj Sumangala 			struct { char type; } *pkt;
419699811510SSuraj Sumangala 
419799811510SSuraj Sumangala 			/* Start of the frame */
419899811510SSuraj Sumangala 			pkt = data;
419999811510SSuraj Sumangala 			type = pkt->type;
420099811510SSuraj Sumangala 
420199811510SSuraj Sumangala 			data++;
420299811510SSuraj Sumangala 			count--;
420399811510SSuraj Sumangala 		} else
420499811510SSuraj Sumangala 			type = bt_cb(skb)->pkt_type;
420599811510SSuraj Sumangala 
42061e429f38SGustavo F. Padovan 		rem = hci_reassembly(hdev, type, data, count,
42071e429f38SGustavo F. Padovan 				     STREAM_REASSEMBLY);
420899811510SSuraj Sumangala 		if (rem < 0)
420999811510SSuraj Sumangala 			return rem;
421099811510SSuraj Sumangala 
421199811510SSuraj Sumangala 		data += (count - rem);
421299811510SSuraj Sumangala 		count = rem;
4213f81c6224SJoe Perches 	}
421499811510SSuraj Sumangala 
421599811510SSuraj Sumangala 	return rem;
421699811510SSuraj Sumangala }
421799811510SSuraj Sumangala EXPORT_SYMBOL(hci_recv_stream_fragment);
421899811510SSuraj Sumangala 
42191da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */
42201da177e4SLinus Torvalds 
42211da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb)
42221da177e4SLinus Torvalds {
42231da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
42241da177e4SLinus Torvalds 
4225f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
42261da177e4SLinus Torvalds 	list_add(&cb->list, &hci_cb_list);
4227f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
42281da177e4SLinus Torvalds 
42291da177e4SLinus Torvalds 	return 0;
42301da177e4SLinus Torvalds }
42311da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb);
42321da177e4SLinus Torvalds 
42331da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb)
42341da177e4SLinus Torvalds {
42351da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
42361da177e4SLinus Torvalds 
4237f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
42381da177e4SLinus Torvalds 	list_del(&cb->list);
4239f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
42401da177e4SLinus Torvalds 
42411da177e4SLinus Torvalds 	return 0;
42421da177e4SLinus Torvalds }
42431da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb);
42441da177e4SLinus Torvalds 
424551086991SMarcel Holtmann static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
42461da177e4SLinus Torvalds {
42470d48d939SMarcel Holtmann 	BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
42481da177e4SLinus Torvalds 
42491da177e4SLinus Torvalds 	/* Time stamp */
4250a61bbcf2SPatrick McHardy 	__net_timestamp(skb);
42511da177e4SLinus Torvalds 
4252cd82e61cSMarcel Holtmann 	/* Send copy to monitor */
4253cd82e61cSMarcel Holtmann 	hci_send_to_monitor(hdev, skb);
4254cd82e61cSMarcel Holtmann 
4255cd82e61cSMarcel Holtmann 	if (atomic_read(&hdev->promisc)) {
4256cd82e61cSMarcel Holtmann 		/* Send copy to the sockets */
4257470fe1b5SMarcel Holtmann 		hci_send_to_sock(hdev, skb);
42581da177e4SLinus Torvalds 	}
42591da177e4SLinus Torvalds 
42601da177e4SLinus Torvalds 	/* Get rid of skb owner, prior to sending to the driver. */
42611da177e4SLinus Torvalds 	skb_orphan(skb);
42621da177e4SLinus Torvalds 
42637bd8f09fSMarcel Holtmann 	if (hdev->send(hdev, skb) < 0)
426451086991SMarcel Holtmann 		BT_ERR("%s sending frame failed", hdev->name);
42651da177e4SLinus Torvalds }
42661da177e4SLinus Torvalds 
42673119ae95SJohan Hedberg void hci_req_init(struct hci_request *req, struct hci_dev *hdev)
42683119ae95SJohan Hedberg {
42693119ae95SJohan Hedberg 	skb_queue_head_init(&req->cmd_q);
42703119ae95SJohan Hedberg 	req->hdev = hdev;
42715d73e034SAndre Guedes 	req->err = 0;
42723119ae95SJohan Hedberg }
42733119ae95SJohan Hedberg 
42743119ae95SJohan Hedberg int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
42753119ae95SJohan Hedberg {
42763119ae95SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
42773119ae95SJohan Hedberg 	struct sk_buff *skb;
42783119ae95SJohan Hedberg 	unsigned long flags;
42793119ae95SJohan Hedberg 
42803119ae95SJohan Hedberg 	BT_DBG("length %u", skb_queue_len(&req->cmd_q));
42813119ae95SJohan Hedberg 
42825d73e034SAndre Guedes 	/* If an error occured during request building, remove all HCI
42835d73e034SAndre Guedes 	 * commands queued on the HCI request queue.
42845d73e034SAndre Guedes 	 */
42855d73e034SAndre Guedes 	if (req->err) {
42865d73e034SAndre Guedes 		skb_queue_purge(&req->cmd_q);
42875d73e034SAndre Guedes 		return req->err;
42885d73e034SAndre Guedes 	}
42895d73e034SAndre Guedes 
42903119ae95SJohan Hedberg 	/* Do not allow empty requests */
42913119ae95SJohan Hedberg 	if (skb_queue_empty(&req->cmd_q))
4292382b0c39SAndre Guedes 		return -ENODATA;
42933119ae95SJohan Hedberg 
42943119ae95SJohan Hedberg 	skb = skb_peek_tail(&req->cmd_q);
42953119ae95SJohan Hedberg 	bt_cb(skb)->req.complete = complete;
42963119ae95SJohan Hedberg 
42973119ae95SJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
42983119ae95SJohan Hedberg 	skb_queue_splice_tail(&req->cmd_q, &hdev->cmd_q);
42993119ae95SJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
43003119ae95SJohan Hedberg 
43013119ae95SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
43023119ae95SJohan Hedberg 
43033119ae95SJohan Hedberg 	return 0;
43043119ae95SJohan Hedberg }
43053119ae95SJohan Hedberg 
43061ca3a9d0SJohan Hedberg static struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode,
430707dc93ddSJohan Hedberg 				       u32 plen, const void *param)
43081da177e4SLinus Torvalds {
43091da177e4SLinus Torvalds 	int len = HCI_COMMAND_HDR_SIZE + plen;
43101da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
43111da177e4SLinus Torvalds 	struct sk_buff *skb;
43121da177e4SLinus Torvalds 
43131da177e4SLinus Torvalds 	skb = bt_skb_alloc(len, GFP_ATOMIC);
43141ca3a9d0SJohan Hedberg 	if (!skb)
43151ca3a9d0SJohan Hedberg 		return NULL;
43161da177e4SLinus Torvalds 
43171da177e4SLinus Torvalds 	hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE);
4318a9de9248SMarcel Holtmann 	hdr->opcode = cpu_to_le16(opcode);
43191da177e4SLinus Torvalds 	hdr->plen   = plen;
43201da177e4SLinus Torvalds 
43211da177e4SLinus Torvalds 	if (plen)
43221da177e4SLinus Torvalds 		memcpy(skb_put(skb, plen), param, plen);
43231da177e4SLinus Torvalds 
43241da177e4SLinus Torvalds 	BT_DBG("skb len %d", skb->len);
43251da177e4SLinus Torvalds 
43260d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
4327c78ae283SMarcel Holtmann 
43281ca3a9d0SJohan Hedberg 	return skb;
43291ca3a9d0SJohan Hedberg }
43301ca3a9d0SJohan Hedberg 
43311ca3a9d0SJohan Hedberg /* Send HCI command */
433207dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
433307dc93ddSJohan Hedberg 		 const void *param)
43341ca3a9d0SJohan Hedberg {
43351ca3a9d0SJohan Hedberg 	struct sk_buff *skb;
43361ca3a9d0SJohan Hedberg 
43371ca3a9d0SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
43381ca3a9d0SJohan Hedberg 
43391ca3a9d0SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
43401ca3a9d0SJohan Hedberg 	if (!skb) {
43411ca3a9d0SJohan Hedberg 		BT_ERR("%s no memory for command", hdev->name);
43421ca3a9d0SJohan Hedberg 		return -ENOMEM;
43431ca3a9d0SJohan Hedberg 	}
43441ca3a9d0SJohan Hedberg 
434511714b3dSJohan Hedberg 	/* Stand-alone HCI commands must be flaged as
434611714b3dSJohan Hedberg 	 * single-command requests.
434711714b3dSJohan Hedberg 	 */
434811714b3dSJohan Hedberg 	bt_cb(skb)->req.start = true;
434911714b3dSJohan Hedberg 
43501da177e4SLinus Torvalds 	skb_queue_tail(&hdev->cmd_q, skb);
4351c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
43521da177e4SLinus Torvalds 
43531da177e4SLinus Torvalds 	return 0;
43541da177e4SLinus Torvalds }
43551da177e4SLinus Torvalds 
435671c76a17SJohan Hedberg /* Queue a command to an asynchronous HCI request */
435707dc93ddSJohan Hedberg void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
435807dc93ddSJohan Hedberg 		    const void *param, u8 event)
435971c76a17SJohan Hedberg {
436071c76a17SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
436171c76a17SJohan Hedberg 	struct sk_buff *skb;
436271c76a17SJohan Hedberg 
436371c76a17SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
436471c76a17SJohan Hedberg 
436534739c1eSAndre Guedes 	/* If an error occured during request building, there is no point in
436634739c1eSAndre Guedes 	 * queueing the HCI command. We can simply return.
436734739c1eSAndre Guedes 	 */
436834739c1eSAndre Guedes 	if (req->err)
436934739c1eSAndre Guedes 		return;
437034739c1eSAndre Guedes 
437171c76a17SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
437271c76a17SJohan Hedberg 	if (!skb) {
43735d73e034SAndre Guedes 		BT_ERR("%s no memory for command (opcode 0x%4.4x)",
43745d73e034SAndre Guedes 		       hdev->name, opcode);
43755d73e034SAndre Guedes 		req->err = -ENOMEM;
4376e348fe6bSAndre Guedes 		return;
437771c76a17SJohan Hedberg 	}
437871c76a17SJohan Hedberg 
437971c76a17SJohan Hedberg 	if (skb_queue_empty(&req->cmd_q))
438071c76a17SJohan Hedberg 		bt_cb(skb)->req.start = true;
438171c76a17SJohan Hedberg 
438202350a72SJohan Hedberg 	bt_cb(skb)->req.event = event;
438302350a72SJohan Hedberg 
438471c76a17SJohan Hedberg 	skb_queue_tail(&req->cmd_q, skb);
438571c76a17SJohan Hedberg }
438671c76a17SJohan Hedberg 
438707dc93ddSJohan Hedberg void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
438807dc93ddSJohan Hedberg 		 const void *param)
438902350a72SJohan Hedberg {
439002350a72SJohan Hedberg 	hci_req_add_ev(req, opcode, plen, param, 0);
439102350a72SJohan Hedberg }
439202350a72SJohan Hedberg 
43931da177e4SLinus Torvalds /* Get data from the previously sent command */
4394a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
43951da177e4SLinus Torvalds {
43961da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
43971da177e4SLinus Torvalds 
43981da177e4SLinus Torvalds 	if (!hdev->sent_cmd)
43991da177e4SLinus Torvalds 		return NULL;
44001da177e4SLinus Torvalds 
44011da177e4SLinus Torvalds 	hdr = (void *) hdev->sent_cmd->data;
44021da177e4SLinus Torvalds 
4403a9de9248SMarcel Holtmann 	if (hdr->opcode != cpu_to_le16(opcode))
44041da177e4SLinus Torvalds 		return NULL;
44051da177e4SLinus Torvalds 
4406f0e09510SAndrei Emeltchenko 	BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
44071da177e4SLinus Torvalds 
44081da177e4SLinus Torvalds 	return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
44091da177e4SLinus Torvalds }
44101da177e4SLinus Torvalds 
44111da177e4SLinus Torvalds /* Send ACL data */
44121da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags)
44131da177e4SLinus Torvalds {
44141da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr;
44151da177e4SLinus Torvalds 	int len = skb->len;
44161da177e4SLinus Torvalds 
4417badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_ACL_HDR_SIZE);
4418badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
44199c70220bSArnaldo Carvalho de Melo 	hdr = (struct hci_acl_hdr *)skb_transport_header(skb);
4420aca3192cSYOSHIFUJI Hideaki 	hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags));
4421aca3192cSYOSHIFUJI Hideaki 	hdr->dlen   = cpu_to_le16(len);
44221da177e4SLinus Torvalds }
44231da177e4SLinus Torvalds 
4424ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
442573d80debSLuiz Augusto von Dentz 			  struct sk_buff *skb, __u16 flags)
44261da177e4SLinus Torvalds {
4427ee22be7eSAndrei Emeltchenko 	struct hci_conn *conn = chan->conn;
44281da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
44291da177e4SLinus Torvalds 	struct sk_buff *list;
44301da177e4SLinus Torvalds 
4431087bfd99SGustavo Padovan 	skb->len = skb_headlen(skb);
4432087bfd99SGustavo Padovan 	skb->data_len = 0;
4433087bfd99SGustavo Padovan 
4434087bfd99SGustavo Padovan 	bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
4435204a6e54SAndrei Emeltchenko 
4436204a6e54SAndrei Emeltchenko 	switch (hdev->dev_type) {
4437204a6e54SAndrei Emeltchenko 	case HCI_BREDR:
4438087bfd99SGustavo Padovan 		hci_add_acl_hdr(skb, conn->handle, flags);
4439204a6e54SAndrei Emeltchenko 		break;
4440204a6e54SAndrei Emeltchenko 	case HCI_AMP:
4441204a6e54SAndrei Emeltchenko 		hci_add_acl_hdr(skb, chan->handle, flags);
4442204a6e54SAndrei Emeltchenko 		break;
4443204a6e54SAndrei Emeltchenko 	default:
4444204a6e54SAndrei Emeltchenko 		BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
4445204a6e54SAndrei Emeltchenko 		return;
4446204a6e54SAndrei Emeltchenko 	}
4447087bfd99SGustavo Padovan 
444870f23020SAndrei Emeltchenko 	list = skb_shinfo(skb)->frag_list;
444970f23020SAndrei Emeltchenko 	if (!list) {
44501da177e4SLinus Torvalds 		/* Non fragmented */
44511da177e4SLinus Torvalds 		BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len);
44521da177e4SLinus Torvalds 
445373d80debSLuiz Augusto von Dentz 		skb_queue_tail(queue, skb);
44541da177e4SLinus Torvalds 	} else {
44551da177e4SLinus Torvalds 		/* Fragmented */
44561da177e4SLinus Torvalds 		BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
44571da177e4SLinus Torvalds 
44581da177e4SLinus Torvalds 		skb_shinfo(skb)->frag_list = NULL;
44591da177e4SLinus Torvalds 
44601da177e4SLinus Torvalds 		/* Queue all fragments atomically */
4461af3e6359SGustavo F. Padovan 		spin_lock(&queue->lock);
44621da177e4SLinus Torvalds 
446373d80debSLuiz Augusto von Dentz 		__skb_queue_tail(queue, skb);
4464e702112fSAndrei Emeltchenko 
4465e702112fSAndrei Emeltchenko 		flags &= ~ACL_START;
4466e702112fSAndrei Emeltchenko 		flags |= ACL_CONT;
44671da177e4SLinus Torvalds 		do {
44681da177e4SLinus Torvalds 			skb = list; list = list->next;
44691da177e4SLinus Torvalds 
44700d48d939SMarcel Holtmann 			bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
4471e702112fSAndrei Emeltchenko 			hci_add_acl_hdr(skb, conn->handle, flags);
44721da177e4SLinus Torvalds 
44731da177e4SLinus Torvalds 			BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
44741da177e4SLinus Torvalds 
447573d80debSLuiz Augusto von Dentz 			__skb_queue_tail(queue, skb);
44761da177e4SLinus Torvalds 		} while (list);
44771da177e4SLinus Torvalds 
4478af3e6359SGustavo F. Padovan 		spin_unlock(&queue->lock);
44791da177e4SLinus Torvalds 	}
448073d80debSLuiz Augusto von Dentz }
448173d80debSLuiz Augusto von Dentz 
448273d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
448373d80debSLuiz Augusto von Dentz {
4484ee22be7eSAndrei Emeltchenko 	struct hci_dev *hdev = chan->conn->hdev;
448573d80debSLuiz Augusto von Dentz 
4486f0e09510SAndrei Emeltchenko 	BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags);
448773d80debSLuiz Augusto von Dentz 
4488ee22be7eSAndrei Emeltchenko 	hci_queue_acl(chan, &chan->data_q, skb, flags);
44891da177e4SLinus Torvalds 
44903eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
44911da177e4SLinus Torvalds }
44921da177e4SLinus Torvalds 
44931da177e4SLinus Torvalds /* Send SCO data */
44940d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
44951da177e4SLinus Torvalds {
44961da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
44971da177e4SLinus Torvalds 	struct hci_sco_hdr hdr;
44981da177e4SLinus Torvalds 
44991da177e4SLinus Torvalds 	BT_DBG("%s len %d", hdev->name, skb->len);
45001da177e4SLinus Torvalds 
4501aca3192cSYOSHIFUJI Hideaki 	hdr.handle = cpu_to_le16(conn->handle);
45021da177e4SLinus Torvalds 	hdr.dlen   = skb->len;
45031da177e4SLinus Torvalds 
4504badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_SCO_HDR_SIZE);
4505badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
45069c70220bSArnaldo Carvalho de Melo 	memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE);
45071da177e4SLinus Torvalds 
45080d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_SCODATA_PKT;
4509c78ae283SMarcel Holtmann 
45101da177e4SLinus Torvalds 	skb_queue_tail(&conn->data_q, skb);
45113eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
45121da177e4SLinus Torvalds }
45131da177e4SLinus Torvalds 
45141da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */
45151da177e4SLinus Torvalds 
45161da177e4SLinus Torvalds /* HCI Connection scheduler */
45176039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
4518a8c5fb1aSGustavo Padovan 				     int *quote)
45191da177e4SLinus Torvalds {
45201da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
45218035ded4SLuiz Augusto von Dentz 	struct hci_conn *conn = NULL, *c;
4522abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0;
45231da177e4SLinus Torvalds 
45241da177e4SLinus Torvalds 	/* We don't have to lock device here. Connections are always
45251da177e4SLinus Torvalds 	 * added and removed with TX task disabled. */
4526bf4c6325SGustavo F. Padovan 
4527bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4528bf4c6325SGustavo F. Padovan 
4529bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
4530769be974SMarcel Holtmann 		if (c->type != type || skb_queue_empty(&c->data_q))
45311da177e4SLinus Torvalds 			continue;
4532769be974SMarcel Holtmann 
4533769be974SMarcel Holtmann 		if (c->state != BT_CONNECTED && c->state != BT_CONFIG)
4534769be974SMarcel Holtmann 			continue;
4535769be974SMarcel Holtmann 
45361da177e4SLinus Torvalds 		num++;
45371da177e4SLinus Torvalds 
45381da177e4SLinus Torvalds 		if (c->sent < min) {
45391da177e4SLinus Torvalds 			min  = c->sent;
45401da177e4SLinus Torvalds 			conn = c;
45411da177e4SLinus Torvalds 		}
454252087a79SLuiz Augusto von Dentz 
454352087a79SLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
454452087a79SLuiz Augusto von Dentz 			break;
45451da177e4SLinus Torvalds 	}
45461da177e4SLinus Torvalds 
4547bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4548bf4c6325SGustavo F. Padovan 
45491da177e4SLinus Torvalds 	if (conn) {
45506ed58ec5SVille Tervo 		int cnt, q;
45516ed58ec5SVille Tervo 
45526ed58ec5SVille Tervo 		switch (conn->type) {
45536ed58ec5SVille Tervo 		case ACL_LINK:
45546ed58ec5SVille Tervo 			cnt = hdev->acl_cnt;
45556ed58ec5SVille Tervo 			break;
45566ed58ec5SVille Tervo 		case SCO_LINK:
45576ed58ec5SVille Tervo 		case ESCO_LINK:
45586ed58ec5SVille Tervo 			cnt = hdev->sco_cnt;
45596ed58ec5SVille Tervo 			break;
45606ed58ec5SVille Tervo 		case LE_LINK:
45616ed58ec5SVille Tervo 			cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
45626ed58ec5SVille Tervo 			break;
45636ed58ec5SVille Tervo 		default:
45646ed58ec5SVille Tervo 			cnt = 0;
45656ed58ec5SVille Tervo 			BT_ERR("Unknown link type");
45666ed58ec5SVille Tervo 		}
45676ed58ec5SVille Tervo 
45686ed58ec5SVille Tervo 		q = cnt / num;
45691da177e4SLinus Torvalds 		*quote = q ? q : 1;
45701da177e4SLinus Torvalds 	} else
45711da177e4SLinus Torvalds 		*quote = 0;
45721da177e4SLinus Torvalds 
45731da177e4SLinus Torvalds 	BT_DBG("conn %p quote %d", conn, *quote);
45741da177e4SLinus Torvalds 	return conn;
45751da177e4SLinus Torvalds }
45761da177e4SLinus Torvalds 
45776039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
45781da177e4SLinus Torvalds {
45791da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
45801da177e4SLinus Torvalds 	struct hci_conn *c;
45811da177e4SLinus Torvalds 
4582bae1f5d9SVille Tervo 	BT_ERR("%s link tx timeout", hdev->name);
45831da177e4SLinus Torvalds 
4584bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4585bf4c6325SGustavo F. Padovan 
45861da177e4SLinus Torvalds 	/* Kill stalled connections */
4587bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
4588bae1f5d9SVille Tervo 		if (c->type == type && c->sent) {
45896ed93dc6SAndrei Emeltchenko 			BT_ERR("%s killing stalled connection %pMR",
45906ed93dc6SAndrei Emeltchenko 			       hdev->name, &c->dst);
4591bed71748SAndre Guedes 			hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
45921da177e4SLinus Torvalds 		}
45931da177e4SLinus Torvalds 	}
4594bf4c6325SGustavo F. Padovan 
4595bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
45961da177e4SLinus Torvalds }
45971da177e4SLinus Torvalds 
45986039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
459973d80debSLuiz Augusto von Dentz 				      int *quote)
460073d80debSLuiz Augusto von Dentz {
460173d80debSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
460273d80debSLuiz Augusto von Dentz 	struct hci_chan *chan = NULL;
4603abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0, cur_prio = 0;
460473d80debSLuiz Augusto von Dentz 	struct hci_conn *conn;
460573d80debSLuiz Augusto von Dentz 	int cnt, q, conn_num = 0;
460673d80debSLuiz Augusto von Dentz 
460773d80debSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
460873d80debSLuiz Augusto von Dentz 
4609bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4610bf4c6325SGustavo F. Padovan 
4611bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
461273d80debSLuiz Augusto von Dentz 		struct hci_chan *tmp;
461373d80debSLuiz Augusto von Dentz 
461473d80debSLuiz Augusto von Dentz 		if (conn->type != type)
461573d80debSLuiz Augusto von Dentz 			continue;
461673d80debSLuiz Augusto von Dentz 
461773d80debSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
461873d80debSLuiz Augusto von Dentz 			continue;
461973d80debSLuiz Augusto von Dentz 
462073d80debSLuiz Augusto von Dentz 		conn_num++;
462173d80debSLuiz Augusto von Dentz 
46228192edefSGustavo F. Padovan 		list_for_each_entry_rcu(tmp, &conn->chan_list, list) {
462373d80debSLuiz Augusto von Dentz 			struct sk_buff *skb;
462473d80debSLuiz Augusto von Dentz 
462573d80debSLuiz Augusto von Dentz 			if (skb_queue_empty(&tmp->data_q))
462673d80debSLuiz Augusto von Dentz 				continue;
462773d80debSLuiz Augusto von Dentz 
462873d80debSLuiz Augusto von Dentz 			skb = skb_peek(&tmp->data_q);
462973d80debSLuiz Augusto von Dentz 			if (skb->priority < cur_prio)
463073d80debSLuiz Augusto von Dentz 				continue;
463173d80debSLuiz Augusto von Dentz 
463273d80debSLuiz Augusto von Dentz 			if (skb->priority > cur_prio) {
463373d80debSLuiz Augusto von Dentz 				num = 0;
463473d80debSLuiz Augusto von Dentz 				min = ~0;
463573d80debSLuiz Augusto von Dentz 				cur_prio = skb->priority;
463673d80debSLuiz Augusto von Dentz 			}
463773d80debSLuiz Augusto von Dentz 
463873d80debSLuiz Augusto von Dentz 			num++;
463973d80debSLuiz Augusto von Dentz 
464073d80debSLuiz Augusto von Dentz 			if (conn->sent < min) {
464173d80debSLuiz Augusto von Dentz 				min  = conn->sent;
464273d80debSLuiz Augusto von Dentz 				chan = tmp;
464373d80debSLuiz Augusto von Dentz 			}
464473d80debSLuiz Augusto von Dentz 		}
464573d80debSLuiz Augusto von Dentz 
464673d80debSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == conn_num)
464773d80debSLuiz Augusto von Dentz 			break;
464873d80debSLuiz Augusto von Dentz 	}
464973d80debSLuiz Augusto von Dentz 
4650bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4651bf4c6325SGustavo F. Padovan 
465273d80debSLuiz Augusto von Dentz 	if (!chan)
465373d80debSLuiz Augusto von Dentz 		return NULL;
465473d80debSLuiz Augusto von Dentz 
465573d80debSLuiz Augusto von Dentz 	switch (chan->conn->type) {
465673d80debSLuiz Augusto von Dentz 	case ACL_LINK:
465773d80debSLuiz Augusto von Dentz 		cnt = hdev->acl_cnt;
465873d80debSLuiz Augusto von Dentz 		break;
4659bd1eb66bSAndrei Emeltchenko 	case AMP_LINK:
4660bd1eb66bSAndrei Emeltchenko 		cnt = hdev->block_cnt;
4661bd1eb66bSAndrei Emeltchenko 		break;
466273d80debSLuiz Augusto von Dentz 	case SCO_LINK:
466373d80debSLuiz Augusto von Dentz 	case ESCO_LINK:
466473d80debSLuiz Augusto von Dentz 		cnt = hdev->sco_cnt;
466573d80debSLuiz Augusto von Dentz 		break;
466673d80debSLuiz Augusto von Dentz 	case LE_LINK:
466773d80debSLuiz Augusto von Dentz 		cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
466873d80debSLuiz Augusto von Dentz 		break;
466973d80debSLuiz Augusto von Dentz 	default:
467073d80debSLuiz Augusto von Dentz 		cnt = 0;
467173d80debSLuiz Augusto von Dentz 		BT_ERR("Unknown link type");
467273d80debSLuiz Augusto von Dentz 	}
467373d80debSLuiz Augusto von Dentz 
467473d80debSLuiz Augusto von Dentz 	q = cnt / num;
467573d80debSLuiz Augusto von Dentz 	*quote = q ? q : 1;
467673d80debSLuiz Augusto von Dentz 	BT_DBG("chan %p quote %d", chan, *quote);
467773d80debSLuiz Augusto von Dentz 	return chan;
467873d80debSLuiz Augusto von Dentz }
467973d80debSLuiz Augusto von Dentz 
468002b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type)
468102b20f0bSLuiz Augusto von Dentz {
468202b20f0bSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
468302b20f0bSLuiz Augusto von Dentz 	struct hci_conn *conn;
468402b20f0bSLuiz Augusto von Dentz 	int num = 0;
468502b20f0bSLuiz Augusto von Dentz 
468602b20f0bSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
468702b20f0bSLuiz Augusto von Dentz 
4688bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4689bf4c6325SGustavo F. Padovan 
4690bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
469102b20f0bSLuiz Augusto von Dentz 		struct hci_chan *chan;
469202b20f0bSLuiz Augusto von Dentz 
469302b20f0bSLuiz Augusto von Dentz 		if (conn->type != type)
469402b20f0bSLuiz Augusto von Dentz 			continue;
469502b20f0bSLuiz Augusto von Dentz 
469602b20f0bSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
469702b20f0bSLuiz Augusto von Dentz 			continue;
469802b20f0bSLuiz Augusto von Dentz 
469902b20f0bSLuiz Augusto von Dentz 		num++;
470002b20f0bSLuiz Augusto von Dentz 
47018192edefSGustavo F. Padovan 		list_for_each_entry_rcu(chan, &conn->chan_list, list) {
470202b20f0bSLuiz Augusto von Dentz 			struct sk_buff *skb;
470302b20f0bSLuiz Augusto von Dentz 
470402b20f0bSLuiz Augusto von Dentz 			if (chan->sent) {
470502b20f0bSLuiz Augusto von Dentz 				chan->sent = 0;
470602b20f0bSLuiz Augusto von Dentz 				continue;
470702b20f0bSLuiz Augusto von Dentz 			}
470802b20f0bSLuiz Augusto von Dentz 
470902b20f0bSLuiz Augusto von Dentz 			if (skb_queue_empty(&chan->data_q))
471002b20f0bSLuiz Augusto von Dentz 				continue;
471102b20f0bSLuiz Augusto von Dentz 
471202b20f0bSLuiz Augusto von Dentz 			skb = skb_peek(&chan->data_q);
471302b20f0bSLuiz Augusto von Dentz 			if (skb->priority >= HCI_PRIO_MAX - 1)
471402b20f0bSLuiz Augusto von Dentz 				continue;
471502b20f0bSLuiz Augusto von Dentz 
471602b20f0bSLuiz Augusto von Dentz 			skb->priority = HCI_PRIO_MAX - 1;
471702b20f0bSLuiz Augusto von Dentz 
471802b20f0bSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p promoted to %d", chan, skb,
471902b20f0bSLuiz Augusto von Dentz 			       skb->priority);
472002b20f0bSLuiz Augusto von Dentz 		}
472102b20f0bSLuiz Augusto von Dentz 
472202b20f0bSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
472302b20f0bSLuiz Augusto von Dentz 			break;
472402b20f0bSLuiz Augusto von Dentz 	}
4725bf4c6325SGustavo F. Padovan 
4726bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4727bf4c6325SGustavo F. Padovan 
472802b20f0bSLuiz Augusto von Dentz }
472902b20f0bSLuiz Augusto von Dentz 
4730b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb)
4731b71d385aSAndrei Emeltchenko {
4732b71d385aSAndrei Emeltchenko 	/* Calculate count of blocks used by this packet */
4733b71d385aSAndrei Emeltchenko 	return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len);
4734b71d385aSAndrei Emeltchenko }
4735b71d385aSAndrei Emeltchenko 
47366039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt)
47371da177e4SLinus Torvalds {
4738fee746b0SMarcel Holtmann 	if (!test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) {
47391da177e4SLinus Torvalds 		/* ACL tx timeout must be longer than maximum
47401da177e4SLinus Torvalds 		 * link supervision timeout (40.9 seconds) */
474163d2bc1bSAndrei Emeltchenko 		if (!cnt && time_after(jiffies, hdev->acl_last_tx +
47425f246e89SAndrei Emeltchenko 				       HCI_ACL_TX_TIMEOUT))
4743bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, ACL_LINK);
47441da177e4SLinus Torvalds 	}
474563d2bc1bSAndrei Emeltchenko }
47461da177e4SLinus Torvalds 
47476039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev)
474863d2bc1bSAndrei Emeltchenko {
474963d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->acl_cnt;
475063d2bc1bSAndrei Emeltchenko 	struct hci_chan *chan;
475163d2bc1bSAndrei Emeltchenko 	struct sk_buff *skb;
475263d2bc1bSAndrei Emeltchenko 	int quote;
475363d2bc1bSAndrei Emeltchenko 
475463d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
475504837f64SMarcel Holtmann 
475673d80debSLuiz Augusto von Dentz 	while (hdev->acl_cnt &&
475773d80debSLuiz Augusto von Dentz 	       (chan = hci_chan_sent(hdev, ACL_LINK, &quote))) {
4758ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
4759ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
476073d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
476173d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
476273d80debSLuiz Augusto von Dentz 
4763ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
4764ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
4765ec1cce24SLuiz Augusto von Dentz 				break;
4766ec1cce24SLuiz Augusto von Dentz 
4767ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
4768ec1cce24SLuiz Augusto von Dentz 
476973d80debSLuiz Augusto von Dentz 			hci_conn_enter_active_mode(chan->conn,
477073d80debSLuiz Augusto von Dentz 						   bt_cb(skb)->force_active);
477104837f64SMarcel Holtmann 
477257d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
47731da177e4SLinus Torvalds 			hdev->acl_last_tx = jiffies;
47741da177e4SLinus Torvalds 
47751da177e4SLinus Torvalds 			hdev->acl_cnt--;
477673d80debSLuiz Augusto von Dentz 			chan->sent++;
477773d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
47781da177e4SLinus Torvalds 		}
47791da177e4SLinus Torvalds 	}
478002b20f0bSLuiz Augusto von Dentz 
478102b20f0bSLuiz Augusto von Dentz 	if (cnt != hdev->acl_cnt)
478202b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, ACL_LINK);
47831da177e4SLinus Torvalds }
47841da177e4SLinus Torvalds 
47856039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev)
4786b71d385aSAndrei Emeltchenko {
478763d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->block_cnt;
4788b71d385aSAndrei Emeltchenko 	struct hci_chan *chan;
4789b71d385aSAndrei Emeltchenko 	struct sk_buff *skb;
4790b71d385aSAndrei Emeltchenko 	int quote;
4791bd1eb66bSAndrei Emeltchenko 	u8 type;
4792b71d385aSAndrei Emeltchenko 
479363d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
4794b71d385aSAndrei Emeltchenko 
4795bd1eb66bSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
4796bd1eb66bSAndrei Emeltchenko 
4797bd1eb66bSAndrei Emeltchenko 	if (hdev->dev_type == HCI_AMP)
4798bd1eb66bSAndrei Emeltchenko 		type = AMP_LINK;
4799bd1eb66bSAndrei Emeltchenko 	else
4800bd1eb66bSAndrei Emeltchenko 		type = ACL_LINK;
4801bd1eb66bSAndrei Emeltchenko 
4802b71d385aSAndrei Emeltchenko 	while (hdev->block_cnt > 0 &&
4803bd1eb66bSAndrei Emeltchenko 	       (chan = hci_chan_sent(hdev, type, &quote))) {
4804b71d385aSAndrei Emeltchenko 		u32 priority = (skb_peek(&chan->data_q))->priority;
4805b71d385aSAndrei Emeltchenko 		while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
4806b71d385aSAndrei Emeltchenko 			int blocks;
4807b71d385aSAndrei Emeltchenko 
4808b71d385aSAndrei Emeltchenko 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
4809b71d385aSAndrei Emeltchenko 			       skb->len, skb->priority);
4810b71d385aSAndrei Emeltchenko 
4811b71d385aSAndrei Emeltchenko 			/* Stop if priority has changed */
4812b71d385aSAndrei Emeltchenko 			if (skb->priority < priority)
4813b71d385aSAndrei Emeltchenko 				break;
4814b71d385aSAndrei Emeltchenko 
4815b71d385aSAndrei Emeltchenko 			skb = skb_dequeue(&chan->data_q);
4816b71d385aSAndrei Emeltchenko 
4817b71d385aSAndrei Emeltchenko 			blocks = __get_blocks(hdev, skb);
4818b71d385aSAndrei Emeltchenko 			if (blocks > hdev->block_cnt)
4819b71d385aSAndrei Emeltchenko 				return;
4820b71d385aSAndrei Emeltchenko 
4821b71d385aSAndrei Emeltchenko 			hci_conn_enter_active_mode(chan->conn,
4822b71d385aSAndrei Emeltchenko 						   bt_cb(skb)->force_active);
4823b71d385aSAndrei Emeltchenko 
482457d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
4825b71d385aSAndrei Emeltchenko 			hdev->acl_last_tx = jiffies;
4826b71d385aSAndrei Emeltchenko 
4827b71d385aSAndrei Emeltchenko 			hdev->block_cnt -= blocks;
4828b71d385aSAndrei Emeltchenko 			quote -= blocks;
4829b71d385aSAndrei Emeltchenko 
4830b71d385aSAndrei Emeltchenko 			chan->sent += blocks;
4831b71d385aSAndrei Emeltchenko 			chan->conn->sent += blocks;
4832b71d385aSAndrei Emeltchenko 		}
4833b71d385aSAndrei Emeltchenko 	}
4834b71d385aSAndrei Emeltchenko 
4835b71d385aSAndrei Emeltchenko 	if (cnt != hdev->block_cnt)
4836bd1eb66bSAndrei Emeltchenko 		hci_prio_recalculate(hdev, type);
4837b71d385aSAndrei Emeltchenko }
4838b71d385aSAndrei Emeltchenko 
48396039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev)
4840b71d385aSAndrei Emeltchenko {
4841b71d385aSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
4842b71d385aSAndrei Emeltchenko 
4843bd1eb66bSAndrei Emeltchenko 	/* No ACL link over BR/EDR controller */
4844bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR)
4845bd1eb66bSAndrei Emeltchenko 		return;
4846bd1eb66bSAndrei Emeltchenko 
4847bd1eb66bSAndrei Emeltchenko 	/* No AMP link over AMP controller */
4848bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
4849b71d385aSAndrei Emeltchenko 		return;
4850b71d385aSAndrei Emeltchenko 
4851b71d385aSAndrei Emeltchenko 	switch (hdev->flow_ctl_mode) {
4852b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_PACKET_BASED:
4853b71d385aSAndrei Emeltchenko 		hci_sched_acl_pkt(hdev);
4854b71d385aSAndrei Emeltchenko 		break;
4855b71d385aSAndrei Emeltchenko 
4856b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_BLOCK_BASED:
4857b71d385aSAndrei Emeltchenko 		hci_sched_acl_blk(hdev);
4858b71d385aSAndrei Emeltchenko 		break;
4859b71d385aSAndrei Emeltchenko 	}
4860b71d385aSAndrei Emeltchenko }
4861b71d385aSAndrei Emeltchenko 
48621da177e4SLinus Torvalds /* Schedule SCO */
48636039aa73SGustavo Padovan static void hci_sched_sco(struct hci_dev *hdev)
48641da177e4SLinus Torvalds {
48651da177e4SLinus Torvalds 	struct hci_conn *conn;
48661da177e4SLinus Torvalds 	struct sk_buff *skb;
48671da177e4SLinus Torvalds 	int quote;
48681da177e4SLinus Torvalds 
48691da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
48701da177e4SLinus Torvalds 
487152087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, SCO_LINK))
487252087a79SLuiz Augusto von Dentz 		return;
487352087a79SLuiz Augusto von Dentz 
48741da177e4SLinus Torvalds 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, &quote))) {
48751da177e4SLinus Torvalds 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
48761da177e4SLinus Torvalds 			BT_DBG("skb %p len %d", skb, skb->len);
487757d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
48781da177e4SLinus Torvalds 
48791da177e4SLinus Torvalds 			conn->sent++;
48801da177e4SLinus Torvalds 			if (conn->sent == ~0)
48811da177e4SLinus Torvalds 				conn->sent = 0;
48821da177e4SLinus Torvalds 		}
48831da177e4SLinus Torvalds 	}
48841da177e4SLinus Torvalds }
48851da177e4SLinus Torvalds 
48866039aa73SGustavo Padovan static void hci_sched_esco(struct hci_dev *hdev)
4887b6a0dc82SMarcel Holtmann {
4888b6a0dc82SMarcel Holtmann 	struct hci_conn *conn;
4889b6a0dc82SMarcel Holtmann 	struct sk_buff *skb;
4890b6a0dc82SMarcel Holtmann 	int quote;
4891b6a0dc82SMarcel Holtmann 
4892b6a0dc82SMarcel Holtmann 	BT_DBG("%s", hdev->name);
4893b6a0dc82SMarcel Holtmann 
489452087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, ESCO_LINK))
489552087a79SLuiz Augusto von Dentz 		return;
489652087a79SLuiz Augusto von Dentz 
48978fc9ced3SGustavo Padovan 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK,
48988fc9ced3SGustavo Padovan 						     &quote))) {
4899b6a0dc82SMarcel Holtmann 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
4900b6a0dc82SMarcel Holtmann 			BT_DBG("skb %p len %d", skb, skb->len);
490157d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
4902b6a0dc82SMarcel Holtmann 
4903b6a0dc82SMarcel Holtmann 			conn->sent++;
4904b6a0dc82SMarcel Holtmann 			if (conn->sent == ~0)
4905b6a0dc82SMarcel Holtmann 				conn->sent = 0;
4906b6a0dc82SMarcel Holtmann 		}
4907b6a0dc82SMarcel Holtmann 	}
4908b6a0dc82SMarcel Holtmann }
4909b6a0dc82SMarcel Holtmann 
49106039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev)
49116ed58ec5SVille Tervo {
491273d80debSLuiz Augusto von Dentz 	struct hci_chan *chan;
49136ed58ec5SVille Tervo 	struct sk_buff *skb;
491402b20f0bSLuiz Augusto von Dentz 	int quote, cnt, tmp;
49156ed58ec5SVille Tervo 
49166ed58ec5SVille Tervo 	BT_DBG("%s", hdev->name);
49176ed58ec5SVille Tervo 
491852087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, LE_LINK))
491952087a79SLuiz Augusto von Dentz 		return;
492052087a79SLuiz Augusto von Dentz 
4921fee746b0SMarcel Holtmann 	if (!test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) {
49226ed58ec5SVille Tervo 		/* LE tx timeout must be longer than maximum
49236ed58ec5SVille Tervo 		 * link supervision timeout (40.9 seconds) */
4924bae1f5d9SVille Tervo 		if (!hdev->le_cnt && hdev->le_pkts &&
49256ed58ec5SVille Tervo 		    time_after(jiffies, hdev->le_last_tx + HZ * 45))
4926bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, LE_LINK);
49276ed58ec5SVille Tervo 	}
49286ed58ec5SVille Tervo 
49296ed58ec5SVille Tervo 	cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
493002b20f0bSLuiz Augusto von Dentz 	tmp = cnt;
493173d80debSLuiz Augusto von Dentz 	while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, &quote))) {
4932ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
4933ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
493473d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
493573d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
49366ed58ec5SVille Tervo 
4937ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
4938ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
4939ec1cce24SLuiz Augusto von Dentz 				break;
4940ec1cce24SLuiz Augusto von Dentz 
4941ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
4942ec1cce24SLuiz Augusto von Dentz 
494357d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
49446ed58ec5SVille Tervo 			hdev->le_last_tx = jiffies;
49456ed58ec5SVille Tervo 
49466ed58ec5SVille Tervo 			cnt--;
494773d80debSLuiz Augusto von Dentz 			chan->sent++;
494873d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
49496ed58ec5SVille Tervo 		}
49506ed58ec5SVille Tervo 	}
495173d80debSLuiz Augusto von Dentz 
49526ed58ec5SVille Tervo 	if (hdev->le_pkts)
49536ed58ec5SVille Tervo 		hdev->le_cnt = cnt;
49546ed58ec5SVille Tervo 	else
49556ed58ec5SVille Tervo 		hdev->acl_cnt = cnt;
495602b20f0bSLuiz Augusto von Dentz 
495702b20f0bSLuiz Augusto von Dentz 	if (cnt != tmp)
495802b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, LE_LINK);
49596ed58ec5SVille Tervo }
49606ed58ec5SVille Tervo 
49613eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work)
49621da177e4SLinus Torvalds {
49633eff45eaSGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work);
49641da177e4SLinus Torvalds 	struct sk_buff *skb;
49651da177e4SLinus Torvalds 
49666ed58ec5SVille Tervo 	BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt,
49676ed58ec5SVille Tervo 	       hdev->sco_cnt, hdev->le_cnt);
49681da177e4SLinus Torvalds 
496952de599eSMarcel Holtmann 	if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
49701da177e4SLinus Torvalds 		/* Schedule queues and send stuff to HCI driver */
49711da177e4SLinus Torvalds 		hci_sched_acl(hdev);
49721da177e4SLinus Torvalds 		hci_sched_sco(hdev);
4973b6a0dc82SMarcel Holtmann 		hci_sched_esco(hdev);
49746ed58ec5SVille Tervo 		hci_sched_le(hdev);
497552de599eSMarcel Holtmann 	}
49766ed58ec5SVille Tervo 
49771da177e4SLinus Torvalds 	/* Send next queued raw (unknown type) packet */
49781da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->raw_q)))
497957d17d70SMarcel Holtmann 		hci_send_frame(hdev, skb);
49801da177e4SLinus Torvalds }
49811da177e4SLinus Torvalds 
498225985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */
49831da177e4SLinus Torvalds 
49841da177e4SLinus Torvalds /* ACL data packet */
49856039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
49861da177e4SLinus Torvalds {
49871da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr = (void *) skb->data;
49881da177e4SLinus Torvalds 	struct hci_conn *conn;
49891da177e4SLinus Torvalds 	__u16 handle, flags;
49901da177e4SLinus Torvalds 
49911da177e4SLinus Torvalds 	skb_pull(skb, HCI_ACL_HDR_SIZE);
49921da177e4SLinus Torvalds 
49931da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
49941da177e4SLinus Torvalds 	flags  = hci_flags(handle);
49951da177e4SLinus Torvalds 	handle = hci_handle(handle);
49961da177e4SLinus Torvalds 
4997f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
4998a8c5fb1aSGustavo Padovan 	       handle, flags);
49991da177e4SLinus Torvalds 
50001da177e4SLinus Torvalds 	hdev->stat.acl_rx++;
50011da177e4SLinus Torvalds 
50021da177e4SLinus Torvalds 	hci_dev_lock(hdev);
50031da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
50041da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
50051da177e4SLinus Torvalds 
50061da177e4SLinus Torvalds 	if (conn) {
500765983fc7SMat Martineau 		hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
500804837f64SMarcel Holtmann 
50091da177e4SLinus Torvalds 		/* Send to upper protocol */
5010686ebf28SUlisses Furquim 		l2cap_recv_acldata(conn, skb, flags);
50111da177e4SLinus Torvalds 		return;
50121da177e4SLinus Torvalds 	} else {
50131da177e4SLinus Torvalds 		BT_ERR("%s ACL packet for unknown connection handle %d",
50141da177e4SLinus Torvalds 		       hdev->name, handle);
50151da177e4SLinus Torvalds 	}
50161da177e4SLinus Torvalds 
50171da177e4SLinus Torvalds 	kfree_skb(skb);
50181da177e4SLinus Torvalds }
50191da177e4SLinus Torvalds 
50201da177e4SLinus Torvalds /* SCO data packet */
50216039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
50221da177e4SLinus Torvalds {
50231da177e4SLinus Torvalds 	struct hci_sco_hdr *hdr = (void *) skb->data;
50241da177e4SLinus Torvalds 	struct hci_conn *conn;
50251da177e4SLinus Torvalds 	__u16 handle;
50261da177e4SLinus Torvalds 
50271da177e4SLinus Torvalds 	skb_pull(skb, HCI_SCO_HDR_SIZE);
50281da177e4SLinus Torvalds 
50291da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
50301da177e4SLinus Torvalds 
5031f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle);
50321da177e4SLinus Torvalds 
50331da177e4SLinus Torvalds 	hdev->stat.sco_rx++;
50341da177e4SLinus Torvalds 
50351da177e4SLinus Torvalds 	hci_dev_lock(hdev);
50361da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
50371da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
50381da177e4SLinus Torvalds 
50391da177e4SLinus Torvalds 	if (conn) {
50401da177e4SLinus Torvalds 		/* Send to upper protocol */
5041686ebf28SUlisses Furquim 		sco_recv_scodata(conn, skb);
50421da177e4SLinus Torvalds 		return;
50431da177e4SLinus Torvalds 	} else {
50441da177e4SLinus Torvalds 		BT_ERR("%s SCO packet for unknown connection handle %d",
50451da177e4SLinus Torvalds 		       hdev->name, handle);
50461da177e4SLinus Torvalds 	}
50471da177e4SLinus Torvalds 
50481da177e4SLinus Torvalds 	kfree_skb(skb);
50491da177e4SLinus Torvalds }
50501da177e4SLinus Torvalds 
50519238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev)
50529238f36aSJohan Hedberg {
50539238f36aSJohan Hedberg 	struct sk_buff *skb;
50549238f36aSJohan Hedberg 
50559238f36aSJohan Hedberg 	skb = skb_peek(&hdev->cmd_q);
50569238f36aSJohan Hedberg 	if (!skb)
50579238f36aSJohan Hedberg 		return true;
50589238f36aSJohan Hedberg 
50599238f36aSJohan Hedberg 	return bt_cb(skb)->req.start;
50609238f36aSJohan Hedberg }
50619238f36aSJohan Hedberg 
506242c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev)
506342c6b129SJohan Hedberg {
506442c6b129SJohan Hedberg 	struct hci_command_hdr *sent;
506542c6b129SJohan Hedberg 	struct sk_buff *skb;
506642c6b129SJohan Hedberg 	u16 opcode;
506742c6b129SJohan Hedberg 
506842c6b129SJohan Hedberg 	if (!hdev->sent_cmd)
506942c6b129SJohan Hedberg 		return;
507042c6b129SJohan Hedberg 
507142c6b129SJohan Hedberg 	sent = (void *) hdev->sent_cmd->data;
507242c6b129SJohan Hedberg 	opcode = __le16_to_cpu(sent->opcode);
507342c6b129SJohan Hedberg 	if (opcode == HCI_OP_RESET)
507442c6b129SJohan Hedberg 		return;
507542c6b129SJohan Hedberg 
507642c6b129SJohan Hedberg 	skb = skb_clone(hdev->sent_cmd, GFP_KERNEL);
507742c6b129SJohan Hedberg 	if (!skb)
507842c6b129SJohan Hedberg 		return;
507942c6b129SJohan Hedberg 
508042c6b129SJohan Hedberg 	skb_queue_head(&hdev->cmd_q, skb);
508142c6b129SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
508242c6b129SJohan Hedberg }
508342c6b129SJohan Hedberg 
50849238f36aSJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status)
50859238f36aSJohan Hedberg {
50869238f36aSJohan Hedberg 	hci_req_complete_t req_complete = NULL;
50879238f36aSJohan Hedberg 	struct sk_buff *skb;
50889238f36aSJohan Hedberg 	unsigned long flags;
50899238f36aSJohan Hedberg 
50909238f36aSJohan Hedberg 	BT_DBG("opcode 0x%04x status 0x%02x", opcode, status);
50919238f36aSJohan Hedberg 
509242c6b129SJohan Hedberg 	/* If the completed command doesn't match the last one that was
509342c6b129SJohan Hedberg 	 * sent we need to do special handling of it.
50949238f36aSJohan Hedberg 	 */
509542c6b129SJohan Hedberg 	if (!hci_sent_cmd_data(hdev, opcode)) {
509642c6b129SJohan Hedberg 		/* Some CSR based controllers generate a spontaneous
509742c6b129SJohan Hedberg 		 * reset complete event during init and any pending
509842c6b129SJohan Hedberg 		 * command will never be completed. In such a case we
509942c6b129SJohan Hedberg 		 * need to resend whatever was the last sent
510042c6b129SJohan Hedberg 		 * command.
510142c6b129SJohan Hedberg 		 */
510242c6b129SJohan Hedberg 		if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET)
510342c6b129SJohan Hedberg 			hci_resend_last(hdev);
510442c6b129SJohan Hedberg 
51059238f36aSJohan Hedberg 		return;
510642c6b129SJohan Hedberg 	}
51079238f36aSJohan Hedberg 
51089238f36aSJohan Hedberg 	/* If the command succeeded and there's still more commands in
51099238f36aSJohan Hedberg 	 * this request the request is not yet complete.
51109238f36aSJohan Hedberg 	 */
51119238f36aSJohan Hedberg 	if (!status && !hci_req_is_complete(hdev))
51129238f36aSJohan Hedberg 		return;
51139238f36aSJohan Hedberg 
51149238f36aSJohan Hedberg 	/* If this was the last command in a request the complete
51159238f36aSJohan Hedberg 	 * callback would be found in hdev->sent_cmd instead of the
51169238f36aSJohan Hedberg 	 * command queue (hdev->cmd_q).
51179238f36aSJohan Hedberg 	 */
51189238f36aSJohan Hedberg 	if (hdev->sent_cmd) {
51199238f36aSJohan Hedberg 		req_complete = bt_cb(hdev->sent_cmd)->req.complete;
512053e21fbcSJohan Hedberg 
512153e21fbcSJohan Hedberg 		if (req_complete) {
512253e21fbcSJohan Hedberg 			/* We must set the complete callback to NULL to
512353e21fbcSJohan Hedberg 			 * avoid calling the callback more than once if
512453e21fbcSJohan Hedberg 			 * this function gets called again.
512553e21fbcSJohan Hedberg 			 */
512653e21fbcSJohan Hedberg 			bt_cb(hdev->sent_cmd)->req.complete = NULL;
512753e21fbcSJohan Hedberg 
51289238f36aSJohan Hedberg 			goto call_complete;
51299238f36aSJohan Hedberg 		}
513053e21fbcSJohan Hedberg 	}
51319238f36aSJohan Hedberg 
51329238f36aSJohan Hedberg 	/* Remove all pending commands belonging to this request */
51339238f36aSJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
51349238f36aSJohan Hedberg 	while ((skb = __skb_dequeue(&hdev->cmd_q))) {
51359238f36aSJohan Hedberg 		if (bt_cb(skb)->req.start) {
51369238f36aSJohan Hedberg 			__skb_queue_head(&hdev->cmd_q, skb);
51379238f36aSJohan Hedberg 			break;
51389238f36aSJohan Hedberg 		}
51399238f36aSJohan Hedberg 
51409238f36aSJohan Hedberg 		req_complete = bt_cb(skb)->req.complete;
51419238f36aSJohan Hedberg 		kfree_skb(skb);
51429238f36aSJohan Hedberg 	}
51439238f36aSJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
51449238f36aSJohan Hedberg 
51459238f36aSJohan Hedberg call_complete:
51469238f36aSJohan Hedberg 	if (req_complete)
51479238f36aSJohan Hedberg 		req_complete(hdev, status);
51489238f36aSJohan Hedberg }
51499238f36aSJohan Hedberg 
5150b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work)
51511da177e4SLinus Torvalds {
5152b78752ccSMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work);
51531da177e4SLinus Torvalds 	struct sk_buff *skb;
51541da177e4SLinus Torvalds 
51551da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
51561da177e4SLinus Torvalds 
51571da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->rx_q))) {
5158cd82e61cSMarcel Holtmann 		/* Send copy to monitor */
5159cd82e61cSMarcel Holtmann 		hci_send_to_monitor(hdev, skb);
5160cd82e61cSMarcel Holtmann 
51611da177e4SLinus Torvalds 		if (atomic_read(&hdev->promisc)) {
51621da177e4SLinus Torvalds 			/* Send copy to the sockets */
5163470fe1b5SMarcel Holtmann 			hci_send_to_sock(hdev, skb);
51641da177e4SLinus Torvalds 		}
51651da177e4SLinus Torvalds 
5166fee746b0SMarcel Holtmann 		if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
51671da177e4SLinus Torvalds 			kfree_skb(skb);
51681da177e4SLinus Torvalds 			continue;
51691da177e4SLinus Torvalds 		}
51701da177e4SLinus Torvalds 
51711da177e4SLinus Torvalds 		if (test_bit(HCI_INIT, &hdev->flags)) {
51721da177e4SLinus Torvalds 			/* Don't process data packets in this states. */
51730d48d939SMarcel Holtmann 			switch (bt_cb(skb)->pkt_type) {
51741da177e4SLinus Torvalds 			case HCI_ACLDATA_PKT:
51751da177e4SLinus Torvalds 			case HCI_SCODATA_PKT:
51761da177e4SLinus Torvalds 				kfree_skb(skb);
51771da177e4SLinus Torvalds 				continue;
51783ff50b79SStephen Hemminger 			}
51791da177e4SLinus Torvalds 		}
51801da177e4SLinus Torvalds 
51811da177e4SLinus Torvalds 		/* Process frame */
51820d48d939SMarcel Holtmann 		switch (bt_cb(skb)->pkt_type) {
51831da177e4SLinus Torvalds 		case HCI_EVENT_PKT:
5184b78752ccSMarcel Holtmann 			BT_DBG("%s Event packet", hdev->name);
51851da177e4SLinus Torvalds 			hci_event_packet(hdev, skb);
51861da177e4SLinus Torvalds 			break;
51871da177e4SLinus Torvalds 
51881da177e4SLinus Torvalds 		case HCI_ACLDATA_PKT:
51891da177e4SLinus Torvalds 			BT_DBG("%s ACL data packet", hdev->name);
51901da177e4SLinus Torvalds 			hci_acldata_packet(hdev, skb);
51911da177e4SLinus Torvalds 			break;
51921da177e4SLinus Torvalds 
51931da177e4SLinus Torvalds 		case HCI_SCODATA_PKT:
51941da177e4SLinus Torvalds 			BT_DBG("%s SCO data packet", hdev->name);
51951da177e4SLinus Torvalds 			hci_scodata_packet(hdev, skb);
51961da177e4SLinus Torvalds 			break;
51971da177e4SLinus Torvalds 
51981da177e4SLinus Torvalds 		default:
51991da177e4SLinus Torvalds 			kfree_skb(skb);
52001da177e4SLinus Torvalds 			break;
52011da177e4SLinus Torvalds 		}
52021da177e4SLinus Torvalds 	}
52031da177e4SLinus Torvalds }
52041da177e4SLinus Torvalds 
5205c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work)
52061da177e4SLinus Torvalds {
5207c347b765SGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work);
52081da177e4SLinus Torvalds 	struct sk_buff *skb;
52091da177e4SLinus Torvalds 
52102104786bSAndrei Emeltchenko 	BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name,
52112104786bSAndrei Emeltchenko 	       atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q));
52121da177e4SLinus Torvalds 
52131da177e4SLinus Torvalds 	/* Send queued commands */
52145a08ecceSAndrei Emeltchenko 	if (atomic_read(&hdev->cmd_cnt)) {
52155a08ecceSAndrei Emeltchenko 		skb = skb_dequeue(&hdev->cmd_q);
52165a08ecceSAndrei Emeltchenko 		if (!skb)
52175a08ecceSAndrei Emeltchenko 			return;
52185a08ecceSAndrei Emeltchenko 
52191da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
52201da177e4SLinus Torvalds 
5221a675d7f1SMarcel Holtmann 		hdev->sent_cmd = skb_clone(skb, GFP_KERNEL);
522270f23020SAndrei Emeltchenko 		if (hdev->sent_cmd) {
52231da177e4SLinus Torvalds 			atomic_dec(&hdev->cmd_cnt);
522457d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
52257bdb8a5cSSzymon Janc 			if (test_bit(HCI_RESET, &hdev->flags))
522665cc2b49SMarcel Holtmann 				cancel_delayed_work(&hdev->cmd_timer);
52277bdb8a5cSSzymon Janc 			else
522865cc2b49SMarcel Holtmann 				schedule_delayed_work(&hdev->cmd_timer,
522965cc2b49SMarcel Holtmann 						      HCI_CMD_TIMEOUT);
52301da177e4SLinus Torvalds 		} else {
52311da177e4SLinus Torvalds 			skb_queue_head(&hdev->cmd_q, skb);
5232c347b765SGustavo F. Padovan 			queue_work(hdev->workqueue, &hdev->cmd_work);
52331da177e4SLinus Torvalds 		}
52341da177e4SLinus Torvalds 	}
52351da177e4SLinus Torvalds }
5236b1efcc28SAndre Guedes 
5237b1efcc28SAndre Guedes void hci_req_add_le_scan_disable(struct hci_request *req)
5238b1efcc28SAndre Guedes {
5239b1efcc28SAndre Guedes 	struct hci_cp_le_set_scan_enable cp;
5240b1efcc28SAndre Guedes 
5241b1efcc28SAndre Guedes 	memset(&cp, 0, sizeof(cp));
5242b1efcc28SAndre Guedes 	cp.enable = LE_SCAN_DISABLE;
5243b1efcc28SAndre Guedes 	hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
5244b1efcc28SAndre Guedes }
5245a4790dbdSAndre Guedes 
52468ef30fd3SAndre Guedes void hci_req_add_le_passive_scan(struct hci_request *req)
52478ef30fd3SAndre Guedes {
52488ef30fd3SAndre Guedes 	struct hci_cp_le_set_scan_param param_cp;
52498ef30fd3SAndre Guedes 	struct hci_cp_le_set_scan_enable enable_cp;
52508ef30fd3SAndre Guedes 	struct hci_dev *hdev = req->hdev;
52518ef30fd3SAndre Guedes 	u8 own_addr_type;
52528ef30fd3SAndre Guedes 
52536ab535a7SMarcel Holtmann 	/* Set require_privacy to false since no SCAN_REQ are send
52546ab535a7SMarcel Holtmann 	 * during passive scanning. Not using an unresolvable address
52556ab535a7SMarcel Holtmann 	 * here is important so that peer devices using direct
52566ab535a7SMarcel Holtmann 	 * advertising with our address will be correctly reported
52576ab535a7SMarcel Holtmann 	 * by the controller.
52588ef30fd3SAndre Guedes 	 */
52596ab535a7SMarcel Holtmann 	if (hci_update_random_address(req, false, &own_addr_type))
52608ef30fd3SAndre Guedes 		return;
52618ef30fd3SAndre Guedes 
52628ef30fd3SAndre Guedes 	memset(&param_cp, 0, sizeof(param_cp));
52638ef30fd3SAndre Guedes 	param_cp.type = LE_SCAN_PASSIVE;
52648ef30fd3SAndre Guedes 	param_cp.interval = cpu_to_le16(hdev->le_scan_interval);
52658ef30fd3SAndre Guedes 	param_cp.window = cpu_to_le16(hdev->le_scan_window);
52668ef30fd3SAndre Guedes 	param_cp.own_address_type = own_addr_type;
52678ef30fd3SAndre Guedes 	hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
52688ef30fd3SAndre Guedes 		    &param_cp);
52698ef30fd3SAndre Guedes 
52708ef30fd3SAndre Guedes 	memset(&enable_cp, 0, sizeof(enable_cp));
52718ef30fd3SAndre Guedes 	enable_cp.enable = LE_SCAN_ENABLE;
52724340a124SAndre Guedes 	enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
52738ef30fd3SAndre Guedes 	hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
52748ef30fd3SAndre Guedes 		    &enable_cp);
52758ef30fd3SAndre Guedes }
52768ef30fd3SAndre Guedes 
5277a4790dbdSAndre Guedes static void update_background_scan_complete(struct hci_dev *hdev, u8 status)
5278a4790dbdSAndre Guedes {
5279a4790dbdSAndre Guedes 	if (status)
5280a4790dbdSAndre Guedes 		BT_DBG("HCI request failed to update background scanning: "
5281a4790dbdSAndre Guedes 		       "status 0x%2.2x", status);
5282a4790dbdSAndre Guedes }
5283a4790dbdSAndre Guedes 
5284a4790dbdSAndre Guedes /* This function controls the background scanning based on hdev->pend_le_conns
5285a4790dbdSAndre Guedes  * list. If there are pending LE connection we start the background scanning,
5286a4790dbdSAndre Guedes  * otherwise we stop it.
5287a4790dbdSAndre Guedes  *
5288a4790dbdSAndre Guedes  * This function requires the caller holds hdev->lock.
5289a4790dbdSAndre Guedes  */
5290a4790dbdSAndre Guedes void hci_update_background_scan(struct hci_dev *hdev)
5291a4790dbdSAndre Guedes {
5292a4790dbdSAndre Guedes 	struct hci_request req;
5293a4790dbdSAndre Guedes 	struct hci_conn *conn;
5294a4790dbdSAndre Guedes 	int err;
5295a4790dbdSAndre Guedes 
5296a4790dbdSAndre Guedes 	hci_req_init(&req, hdev);
5297a4790dbdSAndre Guedes 
5298a4790dbdSAndre Guedes 	if (list_empty(&hdev->pend_le_conns)) {
5299a4790dbdSAndre Guedes 		/* If there is no pending LE connections, we should stop
5300a4790dbdSAndre Guedes 		 * the background scanning.
5301a4790dbdSAndre Guedes 		 */
5302a4790dbdSAndre Guedes 
5303a4790dbdSAndre Guedes 		/* If controller is not scanning we are done. */
5304a4790dbdSAndre Guedes 		if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags))
5305a4790dbdSAndre Guedes 			return;
5306a4790dbdSAndre Guedes 
5307a4790dbdSAndre Guedes 		hci_req_add_le_scan_disable(&req);
5308a4790dbdSAndre Guedes 
5309a4790dbdSAndre Guedes 		BT_DBG("%s stopping background scanning", hdev->name);
5310a4790dbdSAndre Guedes 	} else {
5311a4790dbdSAndre Guedes 		/* If there is at least one pending LE connection, we should
5312a4790dbdSAndre Guedes 		 * keep the background scan running.
5313a4790dbdSAndre Guedes 		 */
5314a4790dbdSAndre Guedes 
5315a4790dbdSAndre Guedes 		/* If controller is connecting, we should not start scanning
5316a4790dbdSAndre Guedes 		 * since some controllers are not able to scan and connect at
5317a4790dbdSAndre Guedes 		 * the same time.
5318a4790dbdSAndre Guedes 		 */
5319a4790dbdSAndre Guedes 		conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
5320a4790dbdSAndre Guedes 		if (conn)
5321a4790dbdSAndre Guedes 			return;
5322a4790dbdSAndre Guedes 
53234340a124SAndre Guedes 		/* If controller is currently scanning, we stop it to ensure we
53244340a124SAndre Guedes 		 * don't miss any advertising (due to duplicates filter).
53254340a124SAndre Guedes 		 */
53264340a124SAndre Guedes 		if (test_bit(HCI_LE_SCAN, &hdev->dev_flags))
53274340a124SAndre Guedes 			hci_req_add_le_scan_disable(&req);
53284340a124SAndre Guedes 
53298ef30fd3SAndre Guedes 		hci_req_add_le_passive_scan(&req);
5330a4790dbdSAndre Guedes 
5331a4790dbdSAndre Guedes 		BT_DBG("%s starting background scanning", hdev->name);
5332a4790dbdSAndre Guedes 	}
5333a4790dbdSAndre Guedes 
5334a4790dbdSAndre Guedes 	err = hci_req_run(&req, update_background_scan_complete);
5335a4790dbdSAndre Guedes 	if (err)
5336a4790dbdSAndre Guedes 		BT_ERR("Failed to run HCI request: err %d", err);
5337a4790dbdSAndre Guedes }
5338