xref: /openbmc/linux/net/bluetooth/hci_core.c (revision 24b06572)
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>
29611b30f7SMarcel Holtmann #include <linux/rfkill.h>
30baf27f6eSMarcel Holtmann #include <linux/debugfs.h>
3199780a7bSJohan Hedberg #include <linux/crypto.h>
327a0e5b15SMatthias Kaehlcke #include <linux/property.h>
339952d90eSAbhishek Pandit-Subedi #include <linux/suspend.h>
349952d90eSAbhishek Pandit-Subedi #include <linux/wait.h>
3547219839SMarcel Holtmann #include <asm/unaligned.h>
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds #include <net/bluetooth/bluetooth.h>
381da177e4SLinus Torvalds #include <net/bluetooth/hci_core.h>
394bc58f51SJohan Hedberg #include <net/bluetooth/l2cap.h>
40af58925cSMarcel Holtmann #include <net/bluetooth/mgmt.h>
411da177e4SLinus Torvalds 
420857dd3bSJohan Hedberg #include "hci_request.h"
4360c5f5fbSMarcel Holtmann #include "hci_debugfs.h"
44970c4e46SJohan Hedberg #include "smp.h"
456d5d2ee6SHeiner Kallweit #include "leds.h"
46145373cbSMiao-chen Chou #include "msft.h"
47970c4e46SJohan Hedberg 
48b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work);
49c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work);
503eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work);
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds /* HCI device list */
531da177e4SLinus Torvalds LIST_HEAD(hci_dev_list);
541da177e4SLinus Torvalds DEFINE_RWLOCK(hci_dev_list_lock);
551da177e4SLinus Torvalds 
561da177e4SLinus Torvalds /* HCI callback list */
571da177e4SLinus Torvalds LIST_HEAD(hci_cb_list);
58fba7ecf0SJohan Hedberg DEFINE_MUTEX(hci_cb_list_lock);
591da177e4SLinus Torvalds 
603df92b31SSasha Levin /* HCI ID Numbering */
613df92b31SSasha Levin static DEFINE_IDA(hci_index_ida);
623df92b31SSasha Levin 
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 
71b7cb93e5SMarcel Holtmann 	buf[0] = hci_dev_test_flag(hdev, HCI_DUT_MODE) ? '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 	bool enable;
833bf5e97dSAndy Shevchenko 	int err;
844b4148e9SMarcel Holtmann 
854b4148e9SMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
864b4148e9SMarcel Holtmann 		return -ENETDOWN;
874b4148e9SMarcel Holtmann 
883bf5e97dSAndy Shevchenko 	err = kstrtobool_from_user(user_buf, count, &enable);
893bf5e97dSAndy Shevchenko 	if (err)
903bf5e97dSAndy Shevchenko 		return err;
914b4148e9SMarcel Holtmann 
92b7cb93e5SMarcel Holtmann 	if (enable == hci_dev_test_flag(hdev, HCI_DUT_MODE))
934b4148e9SMarcel Holtmann 		return -EALREADY;
944b4148e9SMarcel Holtmann 
95b504430cSJohan Hedberg 	hci_req_sync_lock(hdev);
964b4148e9SMarcel Holtmann 	if (enable)
974b4148e9SMarcel Holtmann 		skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL,
984b4148e9SMarcel Holtmann 				     HCI_CMD_TIMEOUT);
994b4148e9SMarcel Holtmann 	else
1004b4148e9SMarcel Holtmann 		skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL,
1014b4148e9SMarcel Holtmann 				     HCI_CMD_TIMEOUT);
102b504430cSJohan Hedberg 	hci_req_sync_unlock(hdev);
1034b4148e9SMarcel Holtmann 
1044b4148e9SMarcel Holtmann 	if (IS_ERR(skb))
1054b4148e9SMarcel Holtmann 		return PTR_ERR(skb);
1064b4148e9SMarcel Holtmann 
1074b4148e9SMarcel Holtmann 	kfree_skb(skb);
1084b4148e9SMarcel Holtmann 
109b7cb93e5SMarcel Holtmann 	hci_dev_change_flag(hdev, HCI_DUT_MODE);
1104b4148e9SMarcel Holtmann 
1114b4148e9SMarcel Holtmann 	return count;
1124b4148e9SMarcel Holtmann }
1134b4148e9SMarcel Holtmann 
1144b4148e9SMarcel Holtmann static const struct file_operations dut_mode_fops = {
1154b4148e9SMarcel Holtmann 	.open		= simple_open,
1164b4148e9SMarcel Holtmann 	.read		= dut_mode_read,
1174b4148e9SMarcel Holtmann 	.write		= dut_mode_write,
1184b4148e9SMarcel Holtmann 	.llseek		= default_llseek,
1194b4148e9SMarcel Holtmann };
1204b4148e9SMarcel Holtmann 
1214b4113d6SMarcel Holtmann static ssize_t vendor_diag_read(struct file *file, char __user *user_buf,
1224b4113d6SMarcel Holtmann 				size_t count, loff_t *ppos)
1234b4113d6SMarcel Holtmann {
1244b4113d6SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
1254b4113d6SMarcel Holtmann 	char buf[3];
1264b4113d6SMarcel Holtmann 
1274b4113d6SMarcel Holtmann 	buf[0] = hci_dev_test_flag(hdev, HCI_VENDOR_DIAG) ? 'Y' : 'N';
1284b4113d6SMarcel Holtmann 	buf[1] = '\n';
1294b4113d6SMarcel Holtmann 	buf[2] = '\0';
1304b4113d6SMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
1314b4113d6SMarcel Holtmann }
1324b4113d6SMarcel Holtmann 
1334b4113d6SMarcel Holtmann static ssize_t vendor_diag_write(struct file *file, const char __user *user_buf,
1344b4113d6SMarcel Holtmann 				 size_t count, loff_t *ppos)
1354b4113d6SMarcel Holtmann {
1364b4113d6SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
1374b4113d6SMarcel Holtmann 	bool enable;
1384b4113d6SMarcel Holtmann 	int err;
1394b4113d6SMarcel Holtmann 
1403bf5e97dSAndy Shevchenko 	err = kstrtobool_from_user(user_buf, count, &enable);
1413bf5e97dSAndy Shevchenko 	if (err)
1423bf5e97dSAndy Shevchenko 		return err;
1434b4113d6SMarcel Holtmann 
1447e995b9eSMarcel Holtmann 	/* When the diagnostic flags are not persistent and the transport
145b56c7b25SMarcel Holtmann 	 * is not active or in user channel operation, then there is no need
146b56c7b25SMarcel Holtmann 	 * for the vendor callback. Instead just store the desired value and
147b56c7b25SMarcel Holtmann 	 * the setting will be programmed when the controller gets powered on.
1487e995b9eSMarcel Holtmann 	 */
1497e995b9eSMarcel Holtmann 	if (test_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks) &&
150b56c7b25SMarcel Holtmann 	    (!test_bit(HCI_RUNNING, &hdev->flags) ||
151b56c7b25SMarcel Holtmann 	     hci_dev_test_flag(hdev, HCI_USER_CHANNEL)))
1527e995b9eSMarcel Holtmann 		goto done;
1537e995b9eSMarcel Holtmann 
154b504430cSJohan Hedberg 	hci_req_sync_lock(hdev);
1554b4113d6SMarcel Holtmann 	err = hdev->set_diag(hdev, enable);
156b504430cSJohan Hedberg 	hci_req_sync_unlock(hdev);
1574b4113d6SMarcel Holtmann 
1584b4113d6SMarcel Holtmann 	if (err < 0)
1594b4113d6SMarcel Holtmann 		return err;
1604b4113d6SMarcel Holtmann 
1617e995b9eSMarcel Holtmann done:
1624b4113d6SMarcel Holtmann 	if (enable)
1634b4113d6SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_VENDOR_DIAG);
1644b4113d6SMarcel Holtmann 	else
1654b4113d6SMarcel Holtmann 		hci_dev_clear_flag(hdev, HCI_VENDOR_DIAG);
1664b4113d6SMarcel Holtmann 
1674b4113d6SMarcel Holtmann 	return count;
1684b4113d6SMarcel Holtmann }
1694b4113d6SMarcel Holtmann 
1704b4113d6SMarcel Holtmann static const struct file_operations vendor_diag_fops = {
1714b4113d6SMarcel Holtmann 	.open		= simple_open,
1724b4113d6SMarcel Holtmann 	.read		= vendor_diag_read,
1734b4113d6SMarcel Holtmann 	.write		= vendor_diag_write,
1744b4113d6SMarcel Holtmann 	.llseek		= default_llseek,
1754b4113d6SMarcel Holtmann };
1764b4113d6SMarcel Holtmann 
177f640ee98SMarcel Holtmann static void hci_debugfs_create_basic(struct hci_dev *hdev)
178f640ee98SMarcel Holtmann {
179f640ee98SMarcel Holtmann 	debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev,
180f640ee98SMarcel Holtmann 			    &dut_mode_fops);
181f640ee98SMarcel Holtmann 
182f640ee98SMarcel Holtmann 	if (hdev->set_diag)
183f640ee98SMarcel Holtmann 		debugfs_create_file("vendor_diag", 0644, hdev->debugfs, hdev,
184f640ee98SMarcel Holtmann 				    &vendor_diag_fops);
185f640ee98SMarcel Holtmann }
186f640ee98SMarcel Holtmann 
187a1d01db1SJohan Hedberg static int hci_reset_req(struct hci_request *req, unsigned long opt)
1881da177e4SLinus Torvalds {
18942c6b129SJohan Hedberg 	BT_DBG("%s %ld", req->hdev->name, opt);
1901da177e4SLinus Torvalds 
1911da177e4SLinus Torvalds 	/* Reset device */
19242c6b129SJohan Hedberg 	set_bit(HCI_RESET, &req->hdev->flags);
19342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_RESET, 0, NULL);
194a1d01db1SJohan Hedberg 	return 0;
1951da177e4SLinus Torvalds }
1961da177e4SLinus Torvalds 
19742c6b129SJohan Hedberg static void bredr_init(struct hci_request *req)
1981da177e4SLinus Torvalds {
19942c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED;
2002455a3eaSAndrei Emeltchenko 
2011da177e4SLinus Torvalds 	/* Read Local Supported Features */
20242c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
2031da177e4SLinus Torvalds 
2041143e5a6SMarcel Holtmann 	/* Read Local Version */
20542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
2062177bab5SJohan Hedberg 
2072177bab5SJohan Hedberg 	/* Read BD Address */
20842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
2091da177e4SLinus Torvalds }
2101da177e4SLinus Torvalds 
2110af801b9SJohan Hedberg static void amp_init1(struct hci_request *req)
212e61ef499SAndrei Emeltchenko {
21342c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED;
2142455a3eaSAndrei Emeltchenko 
215e61ef499SAndrei Emeltchenko 	/* Read Local Version */
21642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
2176bcbc489SAndrei Emeltchenko 
218f6996cfeSMarcel Holtmann 	/* Read Local Supported Commands */
219f6996cfeSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
220f6996cfeSMarcel Holtmann 
2216bcbc489SAndrei Emeltchenko 	/* Read Local AMP Info */
22242c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
223e71dfabaSAndrei Emeltchenko 
224e71dfabaSAndrei Emeltchenko 	/* Read Data Blk size */
22542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL);
2267528ca1cSMarcel Holtmann 
227f38ba941SMarcel Holtmann 	/* Read Flow Control Mode */
228f38ba941SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_FLOW_CONTROL_MODE, 0, NULL);
229f38ba941SMarcel Holtmann 
2307528ca1cSMarcel Holtmann 	/* Read Location Data */
2317528ca1cSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCATION_DATA, 0, NULL);
232e61ef499SAndrei Emeltchenko }
233e61ef499SAndrei Emeltchenko 
234a1d01db1SJohan Hedberg static int amp_init2(struct hci_request *req)
2350af801b9SJohan Hedberg {
2360af801b9SJohan Hedberg 	/* Read Local Supported Features. Not all AMP controllers
2370af801b9SJohan Hedberg 	 * support this so it's placed conditionally in the second
2380af801b9SJohan Hedberg 	 * stage init.
2390af801b9SJohan Hedberg 	 */
2400af801b9SJohan Hedberg 	if (req->hdev->commands[14] & 0x20)
2410af801b9SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
242a1d01db1SJohan Hedberg 
243a1d01db1SJohan Hedberg 	return 0;
2440af801b9SJohan Hedberg }
2450af801b9SJohan Hedberg 
246a1d01db1SJohan Hedberg static int hci_init1_req(struct hci_request *req, unsigned long opt)
247e61ef499SAndrei Emeltchenko {
24842c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
249e61ef499SAndrei Emeltchenko 
250e61ef499SAndrei Emeltchenko 	BT_DBG("%s %ld", hdev->name, opt);
251e61ef499SAndrei Emeltchenko 
25211778716SAndrei Emeltchenko 	/* Reset */
25311778716SAndrei Emeltchenko 	if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
25442c6b129SJohan Hedberg 		hci_reset_req(req, 0);
25511778716SAndrei Emeltchenko 
256e61ef499SAndrei Emeltchenko 	switch (hdev->dev_type) {
257ca8bee5dSMarcel Holtmann 	case HCI_PRIMARY:
25842c6b129SJohan Hedberg 		bredr_init(req);
259e61ef499SAndrei Emeltchenko 		break;
260e61ef499SAndrei Emeltchenko 	case HCI_AMP:
2610af801b9SJohan Hedberg 		amp_init1(req);
262e61ef499SAndrei Emeltchenko 		break;
263e61ef499SAndrei Emeltchenko 	default:
2642064ee33SMarcel Holtmann 		bt_dev_err(hdev, "Unknown device type %d", hdev->dev_type);
265e61ef499SAndrei Emeltchenko 		break;
266e61ef499SAndrei Emeltchenko 	}
267a1d01db1SJohan Hedberg 
268a1d01db1SJohan Hedberg 	return 0;
269e61ef499SAndrei Emeltchenko }
270e61ef499SAndrei Emeltchenko 
27142c6b129SJohan Hedberg static void bredr_setup(struct hci_request *req)
2722177bab5SJohan Hedberg {
2732177bab5SJohan Hedberg 	__le16 param;
2742177bab5SJohan Hedberg 	__u8 flt_type;
2752177bab5SJohan Hedberg 
2762177bab5SJohan Hedberg 	/* Read Buffer Size (ACL mtu, max pkt, etc.) */
27742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL);
2782177bab5SJohan Hedberg 
2792177bab5SJohan Hedberg 	/* Read Class of Device */
28042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL);
2812177bab5SJohan Hedberg 
2822177bab5SJohan Hedberg 	/* Read Local Name */
28342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL);
2842177bab5SJohan Hedberg 
2852177bab5SJohan Hedberg 	/* Read Voice Setting */
28642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL);
2872177bab5SJohan Hedberg 
288b4cb9fb2SMarcel Holtmann 	/* Read Number of Supported IAC */
289b4cb9fb2SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_NUM_SUPPORTED_IAC, 0, NULL);
290b4cb9fb2SMarcel Holtmann 
2914b836f39SMarcel Holtmann 	/* Read Current IAC LAP */
2924b836f39SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_CURRENT_IAC_LAP, 0, NULL);
2934b836f39SMarcel Holtmann 
2942177bab5SJohan Hedberg 	/* Clear Event Filters */
2952177bab5SJohan Hedberg 	flt_type = HCI_FLT_CLEAR_ALL;
29642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type);
2972177bab5SJohan Hedberg 
2982177bab5SJohan Hedberg 	/* Connection accept timeout ~20 secs */
299dcf4adbfSJoe Perches 	param = cpu_to_le16(0x7d00);
30042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, &param);
3012177bab5SJohan Hedberg }
3022177bab5SJohan Hedberg 
30342c6b129SJohan Hedberg static void le_setup(struct hci_request *req)
3042177bab5SJohan Hedberg {
305c73eee91SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
306c73eee91SJohan Hedberg 
3072177bab5SJohan Hedberg 	/* Read LE Buffer Size */
30842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
3092177bab5SJohan Hedberg 
3102177bab5SJohan Hedberg 	/* Read LE Local Supported Features */
31142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL);
3122177bab5SJohan Hedberg 
313747d3f03SMarcel Holtmann 	/* Read LE Supported States */
314747d3f03SMarcel Holtmann 	hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL);
315747d3f03SMarcel Holtmann 
316c73eee91SJohan Hedberg 	/* LE-only controllers have LE implicitly enabled */
317c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
318a1536da2SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_LE_ENABLED);
3192177bab5SJohan Hedberg }
3202177bab5SJohan Hedberg 
32142c6b129SJohan Hedberg static void hci_setup_event_mask(struct hci_request *req)
3222177bab5SJohan Hedberg {
32342c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
32442c6b129SJohan Hedberg 
3252177bab5SJohan Hedberg 	/* The second byte is 0xff instead of 0x9f (two reserved bits
3262177bab5SJohan Hedberg 	 * disabled) since a Broadcom 1.2 dongle doesn't respond to the
3272177bab5SJohan Hedberg 	 * command otherwise.
3282177bab5SJohan Hedberg 	 */
3292177bab5SJohan Hedberg 	u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 };
3302177bab5SJohan Hedberg 
3312177bab5SJohan Hedberg 	/* CSR 1.1 dongles does not accept any bitfield so don't try to set
3322177bab5SJohan Hedberg 	 * any event mask for pre 1.2 devices.
3332177bab5SJohan Hedberg 	 */
3342177bab5SJohan Hedberg 	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
3352177bab5SJohan Hedberg 		return;
3362177bab5SJohan Hedberg 
3372177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
3382177bab5SJohan Hedberg 		events[4] |= 0x01; /* Flow Specification Complete */
339c7882cbdSMarcel Holtmann 	} else {
340c7882cbdSMarcel Holtmann 		/* Use a different default for LE-only devices */
341c7882cbdSMarcel Holtmann 		memset(events, 0, sizeof(events));
342c7882cbdSMarcel Holtmann 		events[1] |= 0x20; /* Command Complete */
343c7882cbdSMarcel Holtmann 		events[1] |= 0x40; /* Command Status */
344c7882cbdSMarcel Holtmann 		events[1] |= 0x80; /* Hardware Error */
3455c3d3b4cSMarcel Holtmann 
3465c3d3b4cSMarcel Holtmann 		/* If the controller supports the Disconnect command, enable
3475c3d3b4cSMarcel Holtmann 		 * the corresponding event. In addition enable packet flow
3485c3d3b4cSMarcel Holtmann 		 * control related events.
3495c3d3b4cSMarcel Holtmann 		 */
3505c3d3b4cSMarcel Holtmann 		if (hdev->commands[0] & 0x20) {
3515c3d3b4cSMarcel Holtmann 			events[0] |= 0x10; /* Disconnection Complete */
352c7882cbdSMarcel Holtmann 			events[2] |= 0x04; /* Number of Completed Packets */
353c7882cbdSMarcel Holtmann 			events[3] |= 0x02; /* Data Buffer Overflow */
3545c3d3b4cSMarcel Holtmann 		}
3555c3d3b4cSMarcel Holtmann 
3565c3d3b4cSMarcel Holtmann 		/* If the controller supports the Read Remote Version
3575c3d3b4cSMarcel Holtmann 		 * Information command, enable the corresponding event.
3585c3d3b4cSMarcel Holtmann 		 */
3595c3d3b4cSMarcel Holtmann 		if (hdev->commands[2] & 0x80)
3605c3d3b4cSMarcel Holtmann 			events[1] |= 0x08; /* Read Remote Version Information
3615c3d3b4cSMarcel Holtmann 					    * Complete
3625c3d3b4cSMarcel Holtmann 					    */
3630da71f1bSMarcel Holtmann 
3640da71f1bSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_ENCRYPTION) {
3650da71f1bSMarcel Holtmann 			events[0] |= 0x80; /* Encryption Change */
366c7882cbdSMarcel Holtmann 			events[5] |= 0x80; /* Encryption Key Refresh Complete */
3672177bab5SJohan Hedberg 		}
3680da71f1bSMarcel Holtmann 	}
3692177bab5SJohan Hedberg 
3709fe759ceSMarcel Holtmann 	if (lmp_inq_rssi_capable(hdev) ||
3719fe759ceSMarcel Holtmann 	    test_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks))
3722177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
3732177bab5SJohan Hedberg 
37470f56aa2SMarcel Holtmann 	if (lmp_ext_feat_capable(hdev))
37570f56aa2SMarcel Holtmann 		events[4] |= 0x04; /* Read Remote Extended Features Complete */
37670f56aa2SMarcel Holtmann 
37770f56aa2SMarcel Holtmann 	if (lmp_esco_capable(hdev)) {
37870f56aa2SMarcel Holtmann 		events[5] |= 0x08; /* Synchronous Connection Complete */
37970f56aa2SMarcel Holtmann 		events[5] |= 0x10; /* Synchronous Connection Changed */
38070f56aa2SMarcel Holtmann 	}
38170f56aa2SMarcel Holtmann 
3822177bab5SJohan Hedberg 	if (lmp_sniffsubr_capable(hdev))
3832177bab5SJohan Hedberg 		events[5] |= 0x20; /* Sniff Subrating */
3842177bab5SJohan Hedberg 
3852177bab5SJohan Hedberg 	if (lmp_pause_enc_capable(hdev))
3862177bab5SJohan Hedberg 		events[5] |= 0x80; /* Encryption Key Refresh Complete */
3872177bab5SJohan Hedberg 
3882177bab5SJohan Hedberg 	if (lmp_ext_inq_capable(hdev))
3892177bab5SJohan Hedberg 		events[5] |= 0x40; /* Extended Inquiry Result */
3902177bab5SJohan Hedberg 
3912177bab5SJohan Hedberg 	if (lmp_no_flush_capable(hdev))
3922177bab5SJohan Hedberg 		events[7] |= 0x01; /* Enhanced Flush Complete */
3932177bab5SJohan Hedberg 
3942177bab5SJohan Hedberg 	if (lmp_lsto_capable(hdev))
3952177bab5SJohan Hedberg 		events[6] |= 0x80; /* Link Supervision Timeout Changed */
3962177bab5SJohan Hedberg 
3972177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
3982177bab5SJohan Hedberg 		events[6] |= 0x01;	/* IO Capability Request */
3992177bab5SJohan Hedberg 		events[6] |= 0x02;	/* IO Capability Response */
4002177bab5SJohan Hedberg 		events[6] |= 0x04;	/* User Confirmation Request */
4012177bab5SJohan Hedberg 		events[6] |= 0x08;	/* User Passkey Request */
4022177bab5SJohan Hedberg 		events[6] |= 0x10;	/* Remote OOB Data Request */
4032177bab5SJohan Hedberg 		events[6] |= 0x20;	/* Simple Pairing Complete */
4042177bab5SJohan Hedberg 		events[7] |= 0x04;	/* User Passkey Notification */
4052177bab5SJohan Hedberg 		events[7] |= 0x08;	/* Keypress Notification */
4062177bab5SJohan Hedberg 		events[7] |= 0x10;	/* Remote Host Supported
4072177bab5SJohan Hedberg 					 * Features Notification
4082177bab5SJohan Hedberg 					 */
4092177bab5SJohan Hedberg 	}
4102177bab5SJohan Hedberg 
4112177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
4122177bab5SJohan Hedberg 		events[7] |= 0x20;	/* LE Meta-Event */
4132177bab5SJohan Hedberg 
41442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events);
4152177bab5SJohan Hedberg }
4162177bab5SJohan Hedberg 
417a1d01db1SJohan Hedberg static int hci_init2_req(struct hci_request *req, unsigned long opt)
4182177bab5SJohan Hedberg {
41942c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
42042c6b129SJohan Hedberg 
4210af801b9SJohan Hedberg 	if (hdev->dev_type == HCI_AMP)
4220af801b9SJohan Hedberg 		return amp_init2(req);
4230af801b9SJohan Hedberg 
4242177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev))
42542c6b129SJohan Hedberg 		bredr_setup(req);
42656f87901SJohan Hedberg 	else
427a358dc11SMarcel Holtmann 		hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED);
4282177bab5SJohan Hedberg 
4292177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
43042c6b129SJohan Hedberg 		le_setup(req);
4312177bab5SJohan Hedberg 
4320f3adeaeSMarcel Holtmann 	/* All Bluetooth 1.2 and later controllers should support the
4330f3adeaeSMarcel Holtmann 	 * HCI command for reading the local supported commands.
4340f3adeaeSMarcel Holtmann 	 *
4350f3adeaeSMarcel Holtmann 	 * Unfortunately some controllers indicate Bluetooth 1.2 support,
4360f3adeaeSMarcel Holtmann 	 * but do not have support for this command. If that is the case,
4370f3adeaeSMarcel Holtmann 	 * the driver can quirk the behavior and skip reading the local
4380f3adeaeSMarcel Holtmann 	 * supported commands.
4393f8e2d75SJohan Hedberg 	 */
4400f3adeaeSMarcel Holtmann 	if (hdev->hci_ver > BLUETOOTH_VER_1_1 &&
4410f3adeaeSMarcel Holtmann 	    !test_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks))
44242c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
4432177bab5SJohan Hedberg 
4442177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
44557af75a8SMarcel Holtmann 		/* When SSP is available, then the host features page
44657af75a8SMarcel Holtmann 		 * should also be available as well. However some
44757af75a8SMarcel Holtmann 		 * controllers list the max_page as 0 as long as SSP
44857af75a8SMarcel Holtmann 		 * has not been enabled. To achieve proper debugging
44957af75a8SMarcel Holtmann 		 * output, force the minimum max_page to 1 at least.
45057af75a8SMarcel Holtmann 		 */
45157af75a8SMarcel Holtmann 		hdev->max_page = 0x01;
45257af75a8SMarcel Holtmann 
453d7a5a11dSMarcel Holtmann 		if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
4542177bab5SJohan Hedberg 			u8 mode = 0x01;
455574ea3c7SMarcel Holtmann 
45642c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_SSP_MODE,
4572177bab5SJohan Hedberg 				    sizeof(mode), &mode);
4582177bab5SJohan Hedberg 		} else {
4592177bab5SJohan Hedberg 			struct hci_cp_write_eir cp;
4602177bab5SJohan Hedberg 
4612177bab5SJohan Hedberg 			memset(hdev->eir, 0, sizeof(hdev->eir));
4622177bab5SJohan Hedberg 			memset(&cp, 0, sizeof(cp));
4632177bab5SJohan Hedberg 
46442c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4652177bab5SJohan Hedberg 		}
4662177bab5SJohan Hedberg 	}
4672177bab5SJohan Hedberg 
468043ec9bfSMarcel Holtmann 	if (lmp_inq_rssi_capable(hdev) ||
469043ec9bfSMarcel Holtmann 	    test_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks)) {
47004422da9SMarcel Holtmann 		u8 mode;
47104422da9SMarcel Holtmann 
47204422da9SMarcel Holtmann 		/* If Extended Inquiry Result events are supported, then
47304422da9SMarcel Holtmann 		 * they are clearly preferred over Inquiry Result with RSSI
47404422da9SMarcel Holtmann 		 * events.
47504422da9SMarcel Holtmann 		 */
47604422da9SMarcel Holtmann 		mode = lmp_ext_inq_capable(hdev) ? 0x02 : 0x01;
47704422da9SMarcel Holtmann 
47804422da9SMarcel Holtmann 		hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode);
47904422da9SMarcel Holtmann 	}
4802177bab5SJohan Hedberg 
4812177bab5SJohan Hedberg 	if (lmp_inq_tx_pwr_capable(hdev))
48242c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL);
4832177bab5SJohan Hedberg 
4842177bab5SJohan Hedberg 	if (lmp_ext_feat_capable(hdev)) {
4852177bab5SJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
4862177bab5SJohan Hedberg 
4872177bab5SJohan Hedberg 		cp.page = 0x01;
48842c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
48942c6b129SJohan Hedberg 			    sizeof(cp), &cp);
4902177bab5SJohan Hedberg 	}
4912177bab5SJohan Hedberg 
492d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) {
4932177bab5SJohan Hedberg 		u8 enable = 1;
49442c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable),
4952177bab5SJohan Hedberg 			    &enable);
4962177bab5SJohan Hedberg 	}
497a1d01db1SJohan Hedberg 
498a1d01db1SJohan Hedberg 	return 0;
4992177bab5SJohan Hedberg }
5002177bab5SJohan Hedberg 
50142c6b129SJohan Hedberg static void hci_setup_link_policy(struct hci_request *req)
5022177bab5SJohan Hedberg {
50342c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
5042177bab5SJohan Hedberg 	struct hci_cp_write_def_link_policy cp;
5052177bab5SJohan Hedberg 	u16 link_policy = 0;
5062177bab5SJohan Hedberg 
5072177bab5SJohan Hedberg 	if (lmp_rswitch_capable(hdev))
5082177bab5SJohan Hedberg 		link_policy |= HCI_LP_RSWITCH;
5092177bab5SJohan Hedberg 	if (lmp_hold_capable(hdev))
5102177bab5SJohan Hedberg 		link_policy |= HCI_LP_HOLD;
5112177bab5SJohan Hedberg 	if (lmp_sniff_capable(hdev))
5122177bab5SJohan Hedberg 		link_policy |= HCI_LP_SNIFF;
5132177bab5SJohan Hedberg 	if (lmp_park_capable(hdev))
5142177bab5SJohan Hedberg 		link_policy |= HCI_LP_PARK;
5152177bab5SJohan Hedberg 
5162177bab5SJohan Hedberg 	cp.policy = cpu_to_le16(link_policy);
51742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp);
5182177bab5SJohan Hedberg }
5192177bab5SJohan Hedberg 
52042c6b129SJohan Hedberg static void hci_set_le_support(struct hci_request *req)
5212177bab5SJohan Hedberg {
52242c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
5232177bab5SJohan Hedberg 	struct hci_cp_write_le_host_supported cp;
5242177bab5SJohan Hedberg 
525c73eee91SJohan Hedberg 	/* LE-only devices do not support explicit enablement */
526c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
527c73eee91SJohan Hedberg 		return;
528c73eee91SJohan Hedberg 
5292177bab5SJohan Hedberg 	memset(&cp, 0, sizeof(cp));
5302177bab5SJohan Hedberg 
531d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
5322177bab5SJohan Hedberg 		cp.le = 0x01;
53332226e4fSMarcel Holtmann 		cp.simul = 0x00;
5342177bab5SJohan Hedberg 	}
5352177bab5SJohan Hedberg 
5362177bab5SJohan Hedberg 	if (cp.le != lmp_host_le_capable(hdev))
53742c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp),
5382177bab5SJohan Hedberg 			    &cp);
5392177bab5SJohan Hedberg }
5402177bab5SJohan Hedberg 
541d62e6d67SJohan Hedberg static void hci_set_event_mask_page_2(struct hci_request *req)
542d62e6d67SJohan Hedberg {
543d62e6d67SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
544d62e6d67SJohan Hedberg 	u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
545313f6888SMarcel Holtmann 	bool changed = false;
546d62e6d67SJohan Hedberg 
547d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast master role is supported
548d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
549d62e6d67SJohan Hedberg 	 */
55053b834d2SMarcel Holtmann 	if (lmp_csb_master_capable(hdev)) {
551d62e6d67SJohan Hedberg 		events[1] |= 0x40;	/* Triggered Clock Capture */
552d62e6d67SJohan Hedberg 		events[1] |= 0x80;	/* Synchronization Train Complete */
553d62e6d67SJohan Hedberg 		events[2] |= 0x10;	/* Slave Page Response Timeout */
554d62e6d67SJohan Hedberg 		events[2] |= 0x20;	/* CSB Channel Map Change */
555313f6888SMarcel Holtmann 		changed = true;
556d62e6d67SJohan Hedberg 	}
557d62e6d67SJohan Hedberg 
558d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast slave role is supported
559d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
560d62e6d67SJohan Hedberg 	 */
56153b834d2SMarcel Holtmann 	if (lmp_csb_slave_capable(hdev)) {
562d62e6d67SJohan Hedberg 		events[2] |= 0x01;	/* Synchronization Train Received */
563d62e6d67SJohan Hedberg 		events[2] |= 0x02;	/* CSB Receive */
564d62e6d67SJohan Hedberg 		events[2] |= 0x04;	/* CSB Timeout */
565d62e6d67SJohan Hedberg 		events[2] |= 0x08;	/* Truncated Page Complete */
566313f6888SMarcel Holtmann 		changed = true;
567d62e6d67SJohan Hedberg 	}
568d62e6d67SJohan Hedberg 
56940c59fcbSMarcel Holtmann 	/* Enable Authenticated Payload Timeout Expired event if supported */
570313f6888SMarcel Holtmann 	if (lmp_ping_capable(hdev) || hdev->le_features[0] & HCI_LE_PING) {
57140c59fcbSMarcel Holtmann 		events[2] |= 0x80;
572313f6888SMarcel Holtmann 		changed = true;
573313f6888SMarcel Holtmann 	}
57440c59fcbSMarcel Holtmann 
575313f6888SMarcel Holtmann 	/* Some Broadcom based controllers indicate support for Set Event
576313f6888SMarcel Holtmann 	 * Mask Page 2 command, but then actually do not support it. Since
577313f6888SMarcel Holtmann 	 * the default value is all bits set to zero, the command is only
578313f6888SMarcel Holtmann 	 * required if the event mask has to be changed. In case no change
579313f6888SMarcel Holtmann 	 * to the event mask is needed, skip this command.
580313f6888SMarcel Holtmann 	 */
581313f6888SMarcel Holtmann 	if (changed)
582313f6888SMarcel Holtmann 		hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2,
583313f6888SMarcel Holtmann 			    sizeof(events), events);
584d62e6d67SJohan Hedberg }
585d62e6d67SJohan Hedberg 
586a1d01db1SJohan Hedberg static int hci_init3_req(struct hci_request *req, unsigned long opt)
5872177bab5SJohan Hedberg {
58842c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
589d2c5d77fSJohan Hedberg 	u8 p;
59042c6b129SJohan Hedberg 
5910da71f1bSMarcel Holtmann 	hci_setup_event_mask(req);
5920da71f1bSMarcel Holtmann 
593e81be90bSJohan Hedberg 	if (hdev->commands[6] & 0x20 &&
594e81be90bSJohan Hedberg 	    !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) {
59548ce62c4SMarcel Holtmann 		struct hci_cp_read_stored_link_key cp;
59648ce62c4SMarcel Holtmann 
59748ce62c4SMarcel Holtmann 		bacpy(&cp.bdaddr, BDADDR_ANY);
59848ce62c4SMarcel Holtmann 		cp.read_all = 0x01;
59948ce62c4SMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_STORED_LINK_KEY, sizeof(cp), &cp);
60048ce62c4SMarcel Holtmann 	}
60148ce62c4SMarcel Holtmann 
6022177bab5SJohan Hedberg 	if (hdev->commands[5] & 0x10)
60342c6b129SJohan Hedberg 		hci_setup_link_policy(req);
6042177bab5SJohan Hedberg 
605417287deSMarcel Holtmann 	if (hdev->commands[8] & 0x01)
606417287deSMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL);
607417287deSMarcel Holtmann 
608cde1a8a9SIsmael Ferreras Morezuelas 	if (hdev->commands[18] & 0x04 &&
609cde1a8a9SIsmael Ferreras Morezuelas 	    !test_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks))
61000bce3fbSAlain Michaud 		hci_req_add(req, HCI_OP_READ_DEF_ERR_DATA_REPORTING, 0, NULL);
61100bce3fbSAlain Michaud 
612417287deSMarcel Holtmann 	/* Some older Broadcom based Bluetooth 1.2 controllers do not
613417287deSMarcel Holtmann 	 * support the Read Page Scan Type command. Check support for
614417287deSMarcel Holtmann 	 * this command in the bit mask of supported commands.
615417287deSMarcel Holtmann 	 */
616417287deSMarcel Holtmann 	if (hdev->commands[13] & 0x01)
617417287deSMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL);
618417287deSMarcel Holtmann 
6199193c6e8SAndre Guedes 	if (lmp_le_capable(hdev)) {
6209193c6e8SAndre Guedes 		u8 events[8];
6219193c6e8SAndre Guedes 
6229193c6e8SAndre Guedes 		memset(events, 0, sizeof(events));
6234d6c705bSMarcel Holtmann 
6244d6c705bSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_ENCRYPTION)
6254d6c705bSMarcel Holtmann 			events[0] |= 0x10;	/* LE Long Term Key Request */
626662bc2e6SAndre Guedes 
627662bc2e6SAndre Guedes 		/* If controller supports the Connection Parameters Request
628662bc2e6SAndre Guedes 		 * Link Layer Procedure, enable the corresponding event.
629662bc2e6SAndre Guedes 		 */
630662bc2e6SAndre Guedes 		if (hdev->le_features[0] & HCI_LE_CONN_PARAM_REQ_PROC)
631662bc2e6SAndre Guedes 			events[0] |= 0x20;	/* LE Remote Connection
632662bc2e6SAndre Guedes 						 * Parameter Request
633662bc2e6SAndre Guedes 						 */
634662bc2e6SAndre Guedes 
635a9f6068eSMarcel Holtmann 		/* If the controller supports the Data Length Extension
636a9f6068eSMarcel Holtmann 		 * feature, enable the corresponding event.
637a9f6068eSMarcel Holtmann 		 */
638a9f6068eSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT)
639a9f6068eSMarcel Holtmann 			events[0] |= 0x40;	/* LE Data Length Change */
640a9f6068eSMarcel Holtmann 
641ff3b8df2SMarcel Holtmann 		/* If the controller supports LL Privacy feature, enable
642ff3b8df2SMarcel Holtmann 		 * the corresponding event.
643ff3b8df2SMarcel Holtmann 		 */
644ff3b8df2SMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_LL_PRIVACY)
645ff3b8df2SMarcel Holtmann 			events[1] |= 0x02;	/* LE Enhanced Connection
646ff3b8df2SMarcel Holtmann 						 * Complete
647ff3b8df2SMarcel Holtmann 						 */
648ff3b8df2SMarcel Holtmann 
6494b71bba4SMarcel Holtmann 		/* If the controller supports Extended Scanner Filter
6504b71bba4SMarcel Holtmann 		 * Policies, enable the correspondig event.
6514b71bba4SMarcel Holtmann 		 */
6524b71bba4SMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY)
6534b71bba4SMarcel Holtmann 			events[1] |= 0x04;	/* LE Direct Advertising
6544b71bba4SMarcel Holtmann 						 * Report
6554b71bba4SMarcel Holtmann 						 */
6564b71bba4SMarcel Holtmann 
6579756d33bSMarcel Holtmann 		/* If the controller supports Channel Selection Algorithm #2
6589756d33bSMarcel Holtmann 		 * feature, enable the corresponding event.
6599756d33bSMarcel Holtmann 		 */
6609756d33bSMarcel Holtmann 		if (hdev->le_features[1] & HCI_LE_CHAN_SEL_ALG2)
6619756d33bSMarcel Holtmann 			events[2] |= 0x08;	/* LE Channel Selection
6629756d33bSMarcel Holtmann 						 * Algorithm
6639756d33bSMarcel Holtmann 						 */
6649756d33bSMarcel Holtmann 
6657d26f5c4SMarcel Holtmann 		/* If the controller supports the LE Set Scan Enable command,
6667d26f5c4SMarcel Holtmann 		 * enable the corresponding advertising report event.
6677d26f5c4SMarcel Holtmann 		 */
6687d26f5c4SMarcel Holtmann 		if (hdev->commands[26] & 0x08)
6697d26f5c4SMarcel Holtmann 			events[0] |= 0x02;	/* LE Advertising Report */
6707d26f5c4SMarcel Holtmann 
6717d26f5c4SMarcel Holtmann 		/* If the controller supports the LE Create Connection
6727d26f5c4SMarcel Holtmann 		 * command, enable the corresponding event.
6737d26f5c4SMarcel Holtmann 		 */
6747d26f5c4SMarcel Holtmann 		if (hdev->commands[26] & 0x10)
6757d26f5c4SMarcel Holtmann 			events[0] |= 0x01;	/* LE Connection Complete */
6767d26f5c4SMarcel Holtmann 
6777d26f5c4SMarcel Holtmann 		/* If the controller supports the LE Connection Update
6787d26f5c4SMarcel Holtmann 		 * command, enable the corresponding event.
6797d26f5c4SMarcel Holtmann 		 */
6807d26f5c4SMarcel Holtmann 		if (hdev->commands[27] & 0x04)
6817d26f5c4SMarcel Holtmann 			events[0] |= 0x04;	/* LE Connection Update
6827d26f5c4SMarcel Holtmann 						 * Complete
6837d26f5c4SMarcel Holtmann 						 */
6847d26f5c4SMarcel Holtmann 
6857d26f5c4SMarcel Holtmann 		/* If the controller supports the LE Read Remote Used Features
6867d26f5c4SMarcel Holtmann 		 * command, enable the corresponding event.
6877d26f5c4SMarcel Holtmann 		 */
6887d26f5c4SMarcel Holtmann 		if (hdev->commands[27] & 0x20)
6897d26f5c4SMarcel Holtmann 			events[0] |= 0x08;	/* LE Read Remote Used
6907d26f5c4SMarcel Holtmann 						 * Features Complete
6917d26f5c4SMarcel Holtmann 						 */
6927d26f5c4SMarcel Holtmann 
6935a34bd5fSMarcel Holtmann 		/* If the controller supports the LE Read Local P-256
6945a34bd5fSMarcel Holtmann 		 * Public Key command, enable the corresponding event.
6955a34bd5fSMarcel Holtmann 		 */
6965a34bd5fSMarcel Holtmann 		if (hdev->commands[34] & 0x02)
6975a34bd5fSMarcel Holtmann 			events[0] |= 0x80;	/* LE Read Local P-256
6985a34bd5fSMarcel Holtmann 						 * Public Key Complete
6995a34bd5fSMarcel Holtmann 						 */
7005a34bd5fSMarcel Holtmann 
7015a34bd5fSMarcel Holtmann 		/* If the controller supports the LE Generate DHKey
7025a34bd5fSMarcel Holtmann 		 * command, enable the corresponding event.
7035a34bd5fSMarcel Holtmann 		 */
7045a34bd5fSMarcel Holtmann 		if (hdev->commands[34] & 0x04)
7055a34bd5fSMarcel Holtmann 			events[1] |= 0x01;	/* LE Generate DHKey Complete */
7065a34bd5fSMarcel Holtmann 
70727bbca44SMarcel Holtmann 		/* If the controller supports the LE Set Default PHY or
70827bbca44SMarcel Holtmann 		 * LE Set PHY commands, enable the corresponding event.
70927bbca44SMarcel Holtmann 		 */
71027bbca44SMarcel Holtmann 		if (hdev->commands[35] & (0x20 | 0x40))
71127bbca44SMarcel Holtmann 			events[1] |= 0x08;        /* LE PHY Update Complete */
71227bbca44SMarcel Holtmann 
713c215e939SJaganath Kanakkassery 		/* If the controller supports LE Set Extended Scan Parameters
714c215e939SJaganath Kanakkassery 		 * and LE Set Extended Scan Enable commands, enable the
715c215e939SJaganath Kanakkassery 		 * corresponding event.
716c215e939SJaganath Kanakkassery 		 */
717c215e939SJaganath Kanakkassery 		if (use_ext_scan(hdev))
718c215e939SJaganath Kanakkassery 			events[1] |= 0x10;	/* LE Extended Advertising
719c215e939SJaganath Kanakkassery 						 * Report
720c215e939SJaganath Kanakkassery 						 */
721c215e939SJaganath Kanakkassery 
722acf0aeaeSJaganath Kanakkassery 		/* If the controller supports the LE Extended Advertising
723acf0aeaeSJaganath Kanakkassery 		 * command, enable the corresponding event.
724acf0aeaeSJaganath Kanakkassery 		 */
725acf0aeaeSJaganath Kanakkassery 		if (ext_adv_capable(hdev))
726acf0aeaeSJaganath Kanakkassery 			events[2] |= 0x02;	/* LE Advertising Set
727acf0aeaeSJaganath Kanakkassery 						 * Terminated
728acf0aeaeSJaganath Kanakkassery 						 */
729acf0aeaeSJaganath Kanakkassery 
7309193c6e8SAndre Guedes 		hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events),
7319193c6e8SAndre Guedes 			    events);
7329193c6e8SAndre Guedes 
73315a49ccaSMarcel Holtmann 		/* Read LE Advertising Channel TX Power */
7346b49bcb4SJaganath Kanakkassery 		if ((hdev->commands[25] & 0x40) && !ext_adv_capable(hdev)) {
7356b49bcb4SJaganath Kanakkassery 			/* HCI TS spec forbids mixing of legacy and extended
7366b49bcb4SJaganath Kanakkassery 			 * advertising commands wherein READ_ADV_TX_POWER is
7376b49bcb4SJaganath Kanakkassery 			 * also included. So do not call it if extended adv
7386b49bcb4SJaganath Kanakkassery 			 * is supported otherwise controller will return
7396b49bcb4SJaganath Kanakkassery 			 * COMMAND_DISALLOWED for extended commands.
7406b49bcb4SJaganath Kanakkassery 			 */
74115a49ccaSMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL);
74215a49ccaSMarcel Holtmann 		}
74315a49ccaSMarcel Holtmann 
7442ab216a7SMarcel Holtmann 		if (hdev->commands[26] & 0x40) {
7452ab216a7SMarcel Holtmann 			/* Read LE White List Size */
7462ab216a7SMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE,
7472ab216a7SMarcel Holtmann 				    0, NULL);
7482ab216a7SMarcel Holtmann 		}
7492ab216a7SMarcel Holtmann 
7502ab216a7SMarcel Holtmann 		if (hdev->commands[26] & 0x80) {
7512ab216a7SMarcel Holtmann 			/* Clear LE White List */
7522ab216a7SMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL);
7532ab216a7SMarcel Holtmann 		}
7542ab216a7SMarcel Holtmann 
755cfdb0c2dSAnkit Navik 		if (hdev->commands[34] & 0x40) {
756cfdb0c2dSAnkit Navik 			/* Read LE Resolving List Size */
757cfdb0c2dSAnkit Navik 			hci_req_add(req, HCI_OP_LE_READ_RESOLV_LIST_SIZE,
758cfdb0c2dSAnkit Navik 				    0, NULL);
759cfdb0c2dSAnkit Navik 		}
760cfdb0c2dSAnkit Navik 
761545f2596SAnkit Navik 		if (hdev->commands[34] & 0x20) {
762545f2596SAnkit Navik 			/* Clear LE Resolving List */
763545f2596SAnkit Navik 			hci_req_add(req, HCI_OP_LE_CLEAR_RESOLV_LIST, 0, NULL);
764545f2596SAnkit Navik 		}
765545f2596SAnkit Navik 
766a9f6068eSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) {
767a9f6068eSMarcel Holtmann 			/* Read LE Maximum Data Length */
768a9f6068eSMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_READ_MAX_DATA_LEN, 0, NULL);
769a9f6068eSMarcel Holtmann 
770a9f6068eSMarcel Holtmann 			/* Read LE Suggested Default Data Length */
771a9f6068eSMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_READ_DEF_DATA_LEN, 0, NULL);
772a9f6068eSMarcel Holtmann 		}
773a9f6068eSMarcel Holtmann 
7746b49bcb4SJaganath Kanakkassery 		if (ext_adv_capable(hdev)) {
7756b49bcb4SJaganath Kanakkassery 			/* Read LE Number of Supported Advertising Sets */
7766b49bcb4SJaganath Kanakkassery 			hci_req_add(req, HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS,
7776b49bcb4SJaganath Kanakkassery 				    0, NULL);
7786b49bcb4SJaganath Kanakkassery 		}
7796b49bcb4SJaganath Kanakkassery 
78042c6b129SJohan Hedberg 		hci_set_le_support(req);
7819193c6e8SAndre Guedes 	}
782d2c5d77fSJohan Hedberg 
783d2c5d77fSJohan Hedberg 	/* Read features beyond page 1 if available */
784d2c5d77fSJohan Hedberg 	for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
785d2c5d77fSJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
786d2c5d77fSJohan Hedberg 
787d2c5d77fSJohan Hedberg 		cp.page = p;
788d2c5d77fSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
789d2c5d77fSJohan Hedberg 			    sizeof(cp), &cp);
790d2c5d77fSJohan Hedberg 	}
791a1d01db1SJohan Hedberg 
792a1d01db1SJohan Hedberg 	return 0;
7932177bab5SJohan Hedberg }
7942177bab5SJohan Hedberg 
795a1d01db1SJohan Hedberg static int hci_init4_req(struct hci_request *req, unsigned long opt)
7965d4e7e8dSJohan Hedberg {
7975d4e7e8dSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
7985d4e7e8dSJohan Hedberg 
79936f260ceSMarcel Holtmann 	/* Some Broadcom based Bluetooth controllers do not support the
80036f260ceSMarcel Holtmann 	 * Delete Stored Link Key command. They are clearly indicating its
80136f260ceSMarcel Holtmann 	 * absence in the bit mask of supported commands.
80236f260ceSMarcel Holtmann 	 *
80336f260ceSMarcel Holtmann 	 * Check the supported commands and only if the the command is marked
80436f260ceSMarcel Holtmann 	 * as supported send it. If not supported assume that the controller
80536f260ceSMarcel Holtmann 	 * does not have actual support for stored link keys which makes this
80636f260ceSMarcel Holtmann 	 * command redundant anyway.
80736f260ceSMarcel Holtmann 	 *
80836f260ceSMarcel Holtmann 	 * Some controllers indicate that they support handling deleting
80936f260ceSMarcel Holtmann 	 * stored link keys, but they don't. The quirk lets a driver
81036f260ceSMarcel Holtmann 	 * just disable this command.
81136f260ceSMarcel Holtmann 	 */
81236f260ceSMarcel Holtmann 	if (hdev->commands[6] & 0x80 &&
81336f260ceSMarcel Holtmann 	    !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) {
81436f260ceSMarcel Holtmann 		struct hci_cp_delete_stored_link_key cp;
81536f260ceSMarcel Holtmann 
81636f260ceSMarcel Holtmann 		bacpy(&cp.bdaddr, BDADDR_ANY);
81736f260ceSMarcel Holtmann 		cp.delete_all = 0x01;
81836f260ceSMarcel Holtmann 		hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY,
81936f260ceSMarcel Holtmann 			    sizeof(cp), &cp);
82036f260ceSMarcel Holtmann 	}
82136f260ceSMarcel Holtmann 
822d62e6d67SJohan Hedberg 	/* Set event mask page 2 if the HCI command for it is supported */
823d62e6d67SJohan Hedberg 	if (hdev->commands[22] & 0x04)
824d62e6d67SJohan Hedberg 		hci_set_event_mask_page_2(req);
825d62e6d67SJohan Hedberg 
826109e3191SMarcel Holtmann 	/* Read local codec list if the HCI command is supported */
827109e3191SMarcel Holtmann 	if (hdev->commands[29] & 0x20)
828109e3191SMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL);
829109e3191SMarcel Holtmann 
830a4790360SMarcel Holtmann 	/* Read local pairing options if the HCI command is supported */
831a4790360SMarcel Holtmann 	if (hdev->commands[41] & 0x08)
832a4790360SMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_LOCAL_PAIRING_OPTS, 0, NULL);
833a4790360SMarcel Holtmann 
834f4fe73edSMarcel Holtmann 	/* Get MWS transport configuration if the HCI command is supported */
835f4fe73edSMarcel Holtmann 	if (hdev->commands[30] & 0x08)
836f4fe73edSMarcel Holtmann 		hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL);
837f4fe73edSMarcel Holtmann 
8385d4e7e8dSJohan Hedberg 	/* Check for Synchronization Train support */
83953b834d2SMarcel Holtmann 	if (lmp_sync_train_capable(hdev))
8405d4e7e8dSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL);
841a6d0d690SMarcel Holtmann 
842a6d0d690SMarcel Holtmann 	/* Enable Secure Connections if supported and configured */
843d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED) &&
844574ea3c7SMarcel Holtmann 	    bredr_sc_enabled(hdev)) {
845a6d0d690SMarcel Holtmann 		u8 support = 0x01;
846574ea3c7SMarcel Holtmann 
847a6d0d690SMarcel Holtmann 		hci_req_add(req, HCI_OP_WRITE_SC_SUPPORT,
848a6d0d690SMarcel Holtmann 			    sizeof(support), &support);
849a6d0d690SMarcel Holtmann 	}
850a1d01db1SJohan Hedberg 
85100bce3fbSAlain Michaud 	/* Set erroneous data reporting if supported to the wideband speech
85200bce3fbSAlain Michaud 	 * setting value
85300bce3fbSAlain Michaud 	 */
854cde1a8a9SIsmael Ferreras Morezuelas 	if (hdev->commands[18] & 0x08 &&
855cde1a8a9SIsmael Ferreras Morezuelas 	    !test_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks)) {
85600bce3fbSAlain Michaud 		bool enabled = hci_dev_test_flag(hdev,
85700bce3fbSAlain Michaud 						 HCI_WIDEBAND_SPEECH_ENABLED);
85800bce3fbSAlain Michaud 
85900bce3fbSAlain Michaud 		if (enabled !=
86000bce3fbSAlain Michaud 		    (hdev->err_data_reporting == ERR_DATA_REPORTING_ENABLED)) {
86100bce3fbSAlain Michaud 			struct hci_cp_write_def_err_data_reporting cp;
86200bce3fbSAlain Michaud 
86300bce3fbSAlain Michaud 			cp.err_data_reporting = enabled ?
86400bce3fbSAlain Michaud 						ERR_DATA_REPORTING_ENABLED :
86500bce3fbSAlain Michaud 						ERR_DATA_REPORTING_DISABLED;
86600bce3fbSAlain Michaud 
86700bce3fbSAlain Michaud 			hci_req_add(req, HCI_OP_WRITE_DEF_ERR_DATA_REPORTING,
86800bce3fbSAlain Michaud 				    sizeof(cp), &cp);
86900bce3fbSAlain Michaud 		}
87000bce3fbSAlain Michaud 	}
87100bce3fbSAlain Michaud 
87212204875SMarcel Holtmann 	/* Set Suggested Default Data Length to maximum if supported */
87312204875SMarcel Holtmann 	if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) {
87412204875SMarcel Holtmann 		struct hci_cp_le_write_def_data_len cp;
87512204875SMarcel Holtmann 
876727ea61aSBen Dooks (Codethink) 		cp.tx_len = cpu_to_le16(hdev->le_max_tx_len);
877727ea61aSBen Dooks (Codethink) 		cp.tx_time = cpu_to_le16(hdev->le_max_tx_time);
87812204875SMarcel Holtmann 		hci_req_add(req, HCI_OP_LE_WRITE_DEF_DATA_LEN, sizeof(cp), &cp);
87912204875SMarcel Holtmann 	}
88012204875SMarcel Holtmann 
881de2ba303SMarcel Holtmann 	/* Set Default PHY parameters if command is supported */
882de2ba303SMarcel Holtmann 	if (hdev->commands[35] & 0x20) {
883de2ba303SMarcel Holtmann 		struct hci_cp_le_set_default_phy cp;
884de2ba303SMarcel Holtmann 
8856decb5b4SJaganath Kanakkassery 		cp.all_phys = 0x00;
8866decb5b4SJaganath Kanakkassery 		cp.tx_phys = hdev->le_tx_def_phys;
8876decb5b4SJaganath Kanakkassery 		cp.rx_phys = hdev->le_rx_def_phys;
888de2ba303SMarcel Holtmann 
889de2ba303SMarcel Holtmann 		hci_req_add(req, HCI_OP_LE_SET_DEFAULT_PHY, sizeof(cp), &cp);
890de2ba303SMarcel Holtmann 	}
891de2ba303SMarcel Holtmann 
892a1d01db1SJohan Hedberg 	return 0;
8935d4e7e8dSJohan Hedberg }
8945d4e7e8dSJohan Hedberg 
8952177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev)
8962177bab5SJohan Hedberg {
8972177bab5SJohan Hedberg 	int err;
8982177bab5SJohan Hedberg 
8994ebeee2dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT, NULL);
9002177bab5SJohan Hedberg 	if (err < 0)
9012177bab5SJohan Hedberg 		return err;
9022177bab5SJohan Hedberg 
903f640ee98SMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_SETUP))
904f640ee98SMarcel Holtmann 		hci_debugfs_create_basic(hdev);
9054b4148e9SMarcel Holtmann 
9064ebeee2dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT, NULL);
9072177bab5SJohan Hedberg 	if (err < 0)
9082177bab5SJohan Hedberg 		return err;
9092177bab5SJohan Hedberg 
910ca8bee5dSMarcel Holtmann 	/* HCI_PRIMARY covers both single-mode LE, BR/EDR and dual-mode
9110af801b9SJohan Hedberg 	 * BR/EDR/LE type controllers. AMP controllers only need the
9120af801b9SJohan Hedberg 	 * first two stages of init.
9130af801b9SJohan Hedberg 	 */
914ca8bee5dSMarcel Holtmann 	if (hdev->dev_type != HCI_PRIMARY)
9150af801b9SJohan Hedberg 		return 0;
9160af801b9SJohan Hedberg 
9174ebeee2dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT, NULL);
9185d4e7e8dSJohan Hedberg 	if (err < 0)
9195d4e7e8dSJohan Hedberg 		return err;
9205d4e7e8dSJohan Hedberg 
9214ebeee2dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT, NULL);
922baf27f6eSMarcel Holtmann 	if (err < 0)
923baf27f6eSMarcel Holtmann 		return err;
924baf27f6eSMarcel Holtmann 
925ec6cef9cSMarcel Holtmann 	/* This function is only called when the controller is actually in
926ec6cef9cSMarcel Holtmann 	 * configured state. When the controller is marked as unconfigured,
927ec6cef9cSMarcel Holtmann 	 * this initialization procedure is not run.
928ec6cef9cSMarcel Holtmann 	 *
929ec6cef9cSMarcel Holtmann 	 * It means that it is possible that a controller runs through its
930ec6cef9cSMarcel Holtmann 	 * setup phase and then discovers missing settings. If that is the
931ec6cef9cSMarcel Holtmann 	 * case, then this function will not be called. It then will only
932ec6cef9cSMarcel Holtmann 	 * be called during the config phase.
933ec6cef9cSMarcel Holtmann 	 *
934ec6cef9cSMarcel Holtmann 	 * So only when in setup phase or config phase, create the debugfs
935ec6cef9cSMarcel Holtmann 	 * entries and register the SMP channels.
936baf27f6eSMarcel Holtmann 	 */
937d7a5a11dSMarcel Holtmann 	if (!hci_dev_test_flag(hdev, HCI_SETUP) &&
938d7a5a11dSMarcel Holtmann 	    !hci_dev_test_flag(hdev, HCI_CONFIG))
939baf27f6eSMarcel Holtmann 		return 0;
940baf27f6eSMarcel Holtmann 
94160c5f5fbSMarcel Holtmann 	hci_debugfs_create_common(hdev);
94260c5f5fbSMarcel Holtmann 
94371c3b60eSMarcel Holtmann 	if (lmp_bredr_capable(hdev))
94460c5f5fbSMarcel Holtmann 		hci_debugfs_create_bredr(hdev);
9452bfa3531SMarcel Holtmann 
946162a3bacSMarcel Holtmann 	if (lmp_le_capable(hdev))
94760c5f5fbSMarcel Holtmann 		hci_debugfs_create_le(hdev);
948e7b8fc92SMarcel Holtmann 
949baf27f6eSMarcel Holtmann 	return 0;
9502177bab5SJohan Hedberg }
9512177bab5SJohan Hedberg 
952a1d01db1SJohan Hedberg static int hci_init0_req(struct hci_request *req, unsigned long opt)
9530ebca7d6SMarcel Holtmann {
9540ebca7d6SMarcel Holtmann 	struct hci_dev *hdev = req->hdev;
9550ebca7d6SMarcel Holtmann 
9560ebca7d6SMarcel Holtmann 	BT_DBG("%s %ld", hdev->name, opt);
9570ebca7d6SMarcel Holtmann 
9580ebca7d6SMarcel Holtmann 	/* Reset */
9590ebca7d6SMarcel Holtmann 	if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
9600ebca7d6SMarcel Holtmann 		hci_reset_req(req, 0);
9610ebca7d6SMarcel Holtmann 
9620ebca7d6SMarcel Holtmann 	/* Read Local Version */
9630ebca7d6SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
9640ebca7d6SMarcel Holtmann 
9650ebca7d6SMarcel Holtmann 	/* Read BD Address */
9660ebca7d6SMarcel Holtmann 	if (hdev->set_bdaddr)
9670ebca7d6SMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
968a1d01db1SJohan Hedberg 
969a1d01db1SJohan Hedberg 	return 0;
9700ebca7d6SMarcel Holtmann }
9710ebca7d6SMarcel Holtmann 
9720ebca7d6SMarcel Holtmann static int __hci_unconf_init(struct hci_dev *hdev)
9730ebca7d6SMarcel Holtmann {
9740ebca7d6SMarcel Holtmann 	int err;
9750ebca7d6SMarcel Holtmann 
976cc78b44bSMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
977cc78b44bSMarcel Holtmann 		return 0;
978cc78b44bSMarcel Holtmann 
9794ebeee2dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init0_req, 0, HCI_INIT_TIMEOUT, NULL);
9800ebca7d6SMarcel Holtmann 	if (err < 0)
9810ebca7d6SMarcel Holtmann 		return err;
9820ebca7d6SMarcel Holtmann 
983f640ee98SMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_SETUP))
984f640ee98SMarcel Holtmann 		hci_debugfs_create_basic(hdev);
985f640ee98SMarcel Holtmann 
9860ebca7d6SMarcel Holtmann 	return 0;
9870ebca7d6SMarcel Holtmann }
9880ebca7d6SMarcel Holtmann 
989a1d01db1SJohan Hedberg static int hci_scan_req(struct hci_request *req, unsigned long opt)
9901da177e4SLinus Torvalds {
9911da177e4SLinus Torvalds 	__u8 scan = opt;
9921da177e4SLinus Torvalds 
99342c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, scan);
9941da177e4SLinus Torvalds 
9951da177e4SLinus Torvalds 	/* Inquiry and Page scans */
99642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
997a1d01db1SJohan Hedberg 	return 0;
9981da177e4SLinus Torvalds }
9991da177e4SLinus Torvalds 
1000a1d01db1SJohan Hedberg static int hci_auth_req(struct hci_request *req, unsigned long opt)
10011da177e4SLinus Torvalds {
10021da177e4SLinus Torvalds 	__u8 auth = opt;
10031da177e4SLinus Torvalds 
100442c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, auth);
10051da177e4SLinus Torvalds 
10061da177e4SLinus Torvalds 	/* Authentication */
100742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
1008a1d01db1SJohan Hedberg 	return 0;
10091da177e4SLinus Torvalds }
10101da177e4SLinus Torvalds 
1011a1d01db1SJohan Hedberg static int hci_encrypt_req(struct hci_request *req, unsigned long opt)
10121da177e4SLinus Torvalds {
10131da177e4SLinus Torvalds 	__u8 encrypt = opt;
10141da177e4SLinus Torvalds 
101542c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, encrypt);
10161da177e4SLinus Torvalds 
1017e4e8e37cSMarcel Holtmann 	/* Encryption */
101842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
1019a1d01db1SJohan Hedberg 	return 0;
10201da177e4SLinus Torvalds }
10211da177e4SLinus Torvalds 
1022a1d01db1SJohan Hedberg static int hci_linkpol_req(struct hci_request *req, unsigned long opt)
1023e4e8e37cSMarcel Holtmann {
1024e4e8e37cSMarcel Holtmann 	__le16 policy = cpu_to_le16(opt);
1025e4e8e37cSMarcel Holtmann 
102642c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, policy);
1027e4e8e37cSMarcel Holtmann 
1028e4e8e37cSMarcel Holtmann 	/* Default link policy */
102942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
1030a1d01db1SJohan Hedberg 	return 0;
1031e4e8e37cSMarcel Holtmann }
1032e4e8e37cSMarcel Holtmann 
10331da177e4SLinus Torvalds /* Get HCI device by index.
10341da177e4SLinus Torvalds  * Device is held on return. */
10351da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index)
10361da177e4SLinus Torvalds {
10378035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev = NULL, *d;
10381da177e4SLinus Torvalds 
10391da177e4SLinus Torvalds 	BT_DBG("%d", index);
10401da177e4SLinus Torvalds 
10411da177e4SLinus Torvalds 	if (index < 0)
10421da177e4SLinus Torvalds 		return NULL;
10431da177e4SLinus Torvalds 
10441da177e4SLinus Torvalds 	read_lock(&hci_dev_list_lock);
10458035ded4SLuiz Augusto von Dentz 	list_for_each_entry(d, &hci_dev_list, list) {
10461da177e4SLinus Torvalds 		if (d->id == index) {
10471da177e4SLinus Torvalds 			hdev = hci_dev_hold(d);
10481da177e4SLinus Torvalds 			break;
10491da177e4SLinus Torvalds 		}
10501da177e4SLinus Torvalds 	}
10511da177e4SLinus Torvalds 	read_unlock(&hci_dev_list_lock);
10521da177e4SLinus Torvalds 	return hdev;
10531da177e4SLinus Torvalds }
10541da177e4SLinus Torvalds 
10551da177e4SLinus Torvalds /* ---- Inquiry support ---- */
1056ff9ef578SJohan Hedberg 
105730dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev)
105830dc78e1SJohan Hedberg {
105930dc78e1SJohan Hedberg 	struct discovery_state *discov = &hdev->discovery;
106030dc78e1SJohan Hedberg 
10616fbe195dSAndre Guedes 	switch (discov->state) {
1062343f935bSAndre Guedes 	case DISCOVERY_FINDING:
10636fbe195dSAndre Guedes 	case DISCOVERY_RESOLVING:
106430dc78e1SJohan Hedberg 		return true;
106530dc78e1SJohan Hedberg 
10666fbe195dSAndre Guedes 	default:
106730dc78e1SJohan Hedberg 		return false;
106830dc78e1SJohan Hedberg 	}
10696fbe195dSAndre Guedes }
107030dc78e1SJohan Hedberg 
1071ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state)
1072ff9ef578SJohan Hedberg {
1073bb3e0a33SJohan Hedberg 	int old_state = hdev->discovery.state;
1074bb3e0a33SJohan Hedberg 
1075ff9ef578SJohan Hedberg 	BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state);
1076ff9ef578SJohan Hedberg 
1077bb3e0a33SJohan Hedberg 	if (old_state == state)
1078ff9ef578SJohan Hedberg 		return;
1079ff9ef578SJohan Hedberg 
1080bb3e0a33SJohan Hedberg 	hdev->discovery.state = state;
1081bb3e0a33SJohan Hedberg 
1082ff9ef578SJohan Hedberg 	switch (state) {
1083ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPED:
1084c54c3860SAndre Guedes 		hci_update_background_scan(hdev);
1085c54c3860SAndre Guedes 
1086bb3e0a33SJohan Hedberg 		if (old_state != DISCOVERY_STARTING)
1087ff9ef578SJohan Hedberg 			mgmt_discovering(hdev, 0);
1088ff9ef578SJohan Hedberg 		break;
1089ff9ef578SJohan Hedberg 	case DISCOVERY_STARTING:
1090ff9ef578SJohan Hedberg 		break;
1091343f935bSAndre Guedes 	case DISCOVERY_FINDING:
1092ff9ef578SJohan Hedberg 		mgmt_discovering(hdev, 1);
1093ff9ef578SJohan Hedberg 		break;
109430dc78e1SJohan Hedberg 	case DISCOVERY_RESOLVING:
109530dc78e1SJohan Hedberg 		break;
1096ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPING:
1097ff9ef578SJohan Hedberg 		break;
1098ff9ef578SJohan Hedberg 	}
1099ff9ef578SJohan Hedberg }
1100ff9ef578SJohan Hedberg 
11011f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev)
11021da177e4SLinus Torvalds {
110330883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1104b57c1a56SJohan Hedberg 	struct inquiry_entry *p, *n;
11051da177e4SLinus Torvalds 
1106561aafbcSJohan Hedberg 	list_for_each_entry_safe(p, n, &cache->all, all) {
1107561aafbcSJohan Hedberg 		list_del(&p->all);
1108b57c1a56SJohan Hedberg 		kfree(p);
11091da177e4SLinus Torvalds 	}
1110561aafbcSJohan Hedberg 
1111561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->unknown);
1112561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->resolve);
11131da177e4SLinus Torvalds }
11141da177e4SLinus Torvalds 
1115a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
1116a8c5fb1aSGustavo Padovan 					       bdaddr_t *bdaddr)
11171da177e4SLinus Torvalds {
111830883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
11191da177e4SLinus Torvalds 	struct inquiry_entry *e;
11201da177e4SLinus Torvalds 
11216ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
11221da177e4SLinus Torvalds 
1123561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
11241da177e4SLinus Torvalds 		if (!bacmp(&e->data.bdaddr, bdaddr))
11251da177e4SLinus Torvalds 			return e;
11261da177e4SLinus Torvalds 	}
11271da177e4SLinus Torvalds 
1128b57c1a56SJohan Hedberg 	return NULL;
1129b57c1a56SJohan Hedberg }
1130b57c1a56SJohan Hedberg 
1131561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
1132561aafbcSJohan Hedberg 						       bdaddr_t *bdaddr)
1133561aafbcSJohan Hedberg {
113430883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1135561aafbcSJohan Hedberg 	struct inquiry_entry *e;
1136561aafbcSJohan Hedberg 
11376ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
1138561aafbcSJohan Hedberg 
1139561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->unknown, list) {
1140561aafbcSJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
1141561aafbcSJohan Hedberg 			return e;
1142561aafbcSJohan Hedberg 	}
1143561aafbcSJohan Hedberg 
1144561aafbcSJohan Hedberg 	return NULL;
1145561aafbcSJohan Hedberg }
1146561aafbcSJohan Hedberg 
114730dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
114830dc78e1SJohan Hedberg 						       bdaddr_t *bdaddr,
114930dc78e1SJohan Hedberg 						       int state)
115030dc78e1SJohan Hedberg {
115130dc78e1SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
115230dc78e1SJohan Hedberg 	struct inquiry_entry *e;
115330dc78e1SJohan Hedberg 
11546ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state);
115530dc78e1SJohan Hedberg 
115630dc78e1SJohan Hedberg 	list_for_each_entry(e, &cache->resolve, list) {
115730dc78e1SJohan Hedberg 		if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state)
115830dc78e1SJohan Hedberg 			return e;
115930dc78e1SJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
116030dc78e1SJohan Hedberg 			return e;
116130dc78e1SJohan Hedberg 	}
116230dc78e1SJohan Hedberg 
116330dc78e1SJohan Hedberg 	return NULL;
116430dc78e1SJohan Hedberg }
116530dc78e1SJohan Hedberg 
1166a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
1167a3d4e20aSJohan Hedberg 				      struct inquiry_entry *ie)
1168a3d4e20aSJohan Hedberg {
1169a3d4e20aSJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1170a3d4e20aSJohan Hedberg 	struct list_head *pos = &cache->resolve;
1171a3d4e20aSJohan Hedberg 	struct inquiry_entry *p;
1172a3d4e20aSJohan Hedberg 
1173a3d4e20aSJohan Hedberg 	list_del(&ie->list);
1174a3d4e20aSJohan Hedberg 
1175a3d4e20aSJohan Hedberg 	list_for_each_entry(p, &cache->resolve, list) {
1176a3d4e20aSJohan Hedberg 		if (p->name_state != NAME_PENDING &&
1177a3d4e20aSJohan Hedberg 		    abs(p->data.rssi) >= abs(ie->data.rssi))
1178a3d4e20aSJohan Hedberg 			break;
1179a3d4e20aSJohan Hedberg 		pos = &p->list;
1180a3d4e20aSJohan Hedberg 	}
1181a3d4e20aSJohan Hedberg 
1182a3d4e20aSJohan Hedberg 	list_add(&ie->list, pos);
1183a3d4e20aSJohan Hedberg }
1184a3d4e20aSJohan Hedberg 
1185af58925cSMarcel Holtmann u32 hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
1186af58925cSMarcel Holtmann 			     bool name_known)
11871da177e4SLinus Torvalds {
118830883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
118970f23020SAndrei Emeltchenko 	struct inquiry_entry *ie;
1190af58925cSMarcel Holtmann 	u32 flags = 0;
11911da177e4SLinus Torvalds 
11926ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, &data->bdaddr);
11931da177e4SLinus Torvalds 
11946928a924SJohan Hedberg 	hci_remove_remote_oob_data(hdev, &data->bdaddr, BDADDR_BREDR);
11952b2fec4dSSzymon Janc 
1196af58925cSMarcel Holtmann 	if (!data->ssp_mode)
1197af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_LEGACY_PAIRING;
1198388fc8faSJohan Hedberg 
119970f23020SAndrei Emeltchenko 	ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr);
1200a3d4e20aSJohan Hedberg 	if (ie) {
1201af58925cSMarcel Holtmann 		if (!ie->data.ssp_mode)
1202af58925cSMarcel Holtmann 			flags |= MGMT_DEV_FOUND_LEGACY_PAIRING;
1203388fc8faSJohan Hedberg 
1204a3d4e20aSJohan Hedberg 		if (ie->name_state == NAME_NEEDED &&
1205a3d4e20aSJohan Hedberg 		    data->rssi != ie->data.rssi) {
1206a3d4e20aSJohan Hedberg 			ie->data.rssi = data->rssi;
1207a3d4e20aSJohan Hedberg 			hci_inquiry_cache_update_resolve(hdev, ie);
1208a3d4e20aSJohan Hedberg 		}
1209a3d4e20aSJohan Hedberg 
1210561aafbcSJohan Hedberg 		goto update;
1211a3d4e20aSJohan Hedberg 	}
1212561aafbcSJohan Hedberg 
12131da177e4SLinus Torvalds 	/* Entry not in the cache. Add new one. */
121427f70f3eSJohan Hedberg 	ie = kzalloc(sizeof(*ie), GFP_KERNEL);
1215af58925cSMarcel Holtmann 	if (!ie) {
1216af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_CONFIRM_NAME;
1217af58925cSMarcel Holtmann 		goto done;
1218af58925cSMarcel Holtmann 	}
121970f23020SAndrei Emeltchenko 
1220561aafbcSJohan Hedberg 	list_add(&ie->all, &cache->all);
1221561aafbcSJohan Hedberg 
1222561aafbcSJohan Hedberg 	if (name_known) {
1223561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
1224561aafbcSJohan Hedberg 	} else {
1225561aafbcSJohan Hedberg 		ie->name_state = NAME_NOT_KNOWN;
1226561aafbcSJohan Hedberg 		list_add(&ie->list, &cache->unknown);
1227561aafbcSJohan Hedberg 	}
1228561aafbcSJohan Hedberg 
1229561aafbcSJohan Hedberg update:
1230561aafbcSJohan Hedberg 	if (name_known && ie->name_state != NAME_KNOWN &&
1231561aafbcSJohan Hedberg 	    ie->name_state != NAME_PENDING) {
1232561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
1233561aafbcSJohan Hedberg 		list_del(&ie->list);
12341da177e4SLinus Torvalds 	}
12351da177e4SLinus Torvalds 
123670f23020SAndrei Emeltchenko 	memcpy(&ie->data, data, sizeof(*data));
123770f23020SAndrei Emeltchenko 	ie->timestamp = jiffies;
12381da177e4SLinus Torvalds 	cache->timestamp = jiffies;
12393175405bSJohan Hedberg 
12403175405bSJohan Hedberg 	if (ie->name_state == NAME_NOT_KNOWN)
1241af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_CONFIRM_NAME;
12423175405bSJohan Hedberg 
1243af58925cSMarcel Holtmann done:
1244af58925cSMarcel Holtmann 	return flags;
12451da177e4SLinus Torvalds }
12461da177e4SLinus Torvalds 
12471da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf)
12481da177e4SLinus Torvalds {
124930883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
12501da177e4SLinus Torvalds 	struct inquiry_info *info = (struct inquiry_info *) buf;
12511da177e4SLinus Torvalds 	struct inquiry_entry *e;
12521da177e4SLinus Torvalds 	int copied = 0;
12531da177e4SLinus Torvalds 
1254561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
12551da177e4SLinus Torvalds 		struct inquiry_data *data = &e->data;
1256b57c1a56SJohan Hedberg 
1257b57c1a56SJohan Hedberg 		if (copied >= num)
1258b57c1a56SJohan Hedberg 			break;
1259b57c1a56SJohan Hedberg 
12601da177e4SLinus Torvalds 		bacpy(&info->bdaddr, &data->bdaddr);
12611da177e4SLinus Torvalds 		info->pscan_rep_mode	= data->pscan_rep_mode;
12621da177e4SLinus Torvalds 		info->pscan_period_mode	= data->pscan_period_mode;
12631da177e4SLinus Torvalds 		info->pscan_mode	= data->pscan_mode;
12641da177e4SLinus Torvalds 		memcpy(info->dev_class, data->dev_class, 3);
12651da177e4SLinus Torvalds 		info->clock_offset	= data->clock_offset;
1266b57c1a56SJohan Hedberg 
12671da177e4SLinus Torvalds 		info++;
1268b57c1a56SJohan Hedberg 		copied++;
12691da177e4SLinus Torvalds 	}
12701da177e4SLinus Torvalds 
12711da177e4SLinus Torvalds 	BT_DBG("cache %p, copied %d", cache, copied);
12721da177e4SLinus Torvalds 	return copied;
12731da177e4SLinus Torvalds }
12741da177e4SLinus Torvalds 
1275a1d01db1SJohan Hedberg static int hci_inq_req(struct hci_request *req, unsigned long opt)
12761da177e4SLinus Torvalds {
12771da177e4SLinus Torvalds 	struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt;
127842c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
12791da177e4SLinus Torvalds 	struct hci_cp_inquiry cp;
12801da177e4SLinus Torvalds 
12811da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
12821da177e4SLinus Torvalds 
12831da177e4SLinus Torvalds 	if (test_bit(HCI_INQUIRY, &hdev->flags))
1284a1d01db1SJohan Hedberg 		return 0;
12851da177e4SLinus Torvalds 
12861da177e4SLinus Torvalds 	/* Start Inquiry */
12871da177e4SLinus Torvalds 	memcpy(&cp.lap, &ir->lap, 3);
12881da177e4SLinus Torvalds 	cp.length  = ir->length;
12891da177e4SLinus Torvalds 	cp.num_rsp = ir->num_rsp;
129042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);
1291a1d01db1SJohan Hedberg 
1292a1d01db1SJohan Hedberg 	return 0;
12931da177e4SLinus Torvalds }
12941da177e4SLinus Torvalds 
12951da177e4SLinus Torvalds int hci_inquiry(void __user *arg)
12961da177e4SLinus Torvalds {
12971da177e4SLinus Torvalds 	__u8 __user *ptr = arg;
12981da177e4SLinus Torvalds 	struct hci_inquiry_req ir;
12991da177e4SLinus Torvalds 	struct hci_dev *hdev;
13001da177e4SLinus Torvalds 	int err = 0, do_inquiry = 0, max_rsp;
13011da177e4SLinus Torvalds 	long timeo;
13021da177e4SLinus Torvalds 	__u8 *buf;
13031da177e4SLinus Torvalds 
13041da177e4SLinus Torvalds 	if (copy_from_user(&ir, ptr, sizeof(ir)))
13051da177e4SLinus Torvalds 		return -EFAULT;
13061da177e4SLinus Torvalds 
13075a08ecceSAndrei Emeltchenko 	hdev = hci_dev_get(ir.dev_id);
13085a08ecceSAndrei Emeltchenko 	if (!hdev)
13091da177e4SLinus Torvalds 		return -ENODEV;
13101da177e4SLinus Torvalds 
1311d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
13120736cfa8SMarcel Holtmann 		err = -EBUSY;
13130736cfa8SMarcel Holtmann 		goto done;
13140736cfa8SMarcel Holtmann 	}
13150736cfa8SMarcel Holtmann 
1316d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
1317fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
1318fee746b0SMarcel Holtmann 		goto done;
1319fee746b0SMarcel Holtmann 	}
1320fee746b0SMarcel Holtmann 
1321ca8bee5dSMarcel Holtmann 	if (hdev->dev_type != HCI_PRIMARY) {
13225b69bef5SMarcel Holtmann 		err = -EOPNOTSUPP;
13235b69bef5SMarcel Holtmann 		goto done;
13245b69bef5SMarcel Holtmann 	}
13255b69bef5SMarcel Holtmann 
1326d7a5a11dSMarcel Holtmann 	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
132756f87901SJohan Hedberg 		err = -EOPNOTSUPP;
132856f87901SJohan Hedberg 		goto done;
132956f87901SJohan Hedberg 	}
133056f87901SJohan Hedberg 
133109fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
13321da177e4SLinus Torvalds 	if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
1333a8c5fb1aSGustavo Padovan 	    inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {
13341f9b9a5dSAndre Guedes 		hci_inquiry_cache_flush(hdev);
13351da177e4SLinus Torvalds 		do_inquiry = 1;
13361da177e4SLinus Torvalds 	}
133709fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
13381da177e4SLinus Torvalds 
133904837f64SMarcel Holtmann 	timeo = ir.length * msecs_to_jiffies(2000);
134070f23020SAndrei Emeltchenko 
134170f23020SAndrei Emeltchenko 	if (do_inquiry) {
134201178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir,
13434ebeee2dSJohan Hedberg 				   timeo, NULL);
134470f23020SAndrei Emeltchenko 		if (err < 0)
13451da177e4SLinus Torvalds 			goto done;
13463e13fa1eSAndre Guedes 
13473e13fa1eSAndre Guedes 		/* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is
13483e13fa1eSAndre Guedes 		 * cleared). If it is interrupted by a signal, return -EINTR.
13493e13fa1eSAndre Guedes 		 */
135074316201SNeilBrown 		if (wait_on_bit(&hdev->flags, HCI_INQUIRY,
13513e13fa1eSAndre Guedes 				TASK_INTERRUPTIBLE))
13523e13fa1eSAndre Guedes 			return -EINTR;
135370f23020SAndrei Emeltchenko 	}
13541da177e4SLinus Torvalds 
13558fc9ced3SGustavo Padovan 	/* for unlimited number of responses we will use buffer with
13568fc9ced3SGustavo Padovan 	 * 255 entries
13578fc9ced3SGustavo Padovan 	 */
13581da177e4SLinus Torvalds 	max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp;
13591da177e4SLinus Torvalds 
13601da177e4SLinus Torvalds 	/* cache_dump can't sleep. Therefore we allocate temp buffer and then
13611da177e4SLinus Torvalds 	 * copy it to the user space.
13621da177e4SLinus Torvalds 	 */
13636da2ec56SKees Cook 	buf = kmalloc_array(max_rsp, sizeof(struct inquiry_info), GFP_KERNEL);
136470f23020SAndrei Emeltchenko 	if (!buf) {
13651da177e4SLinus Torvalds 		err = -ENOMEM;
13661da177e4SLinus Torvalds 		goto done;
13671da177e4SLinus Torvalds 	}
13681da177e4SLinus Torvalds 
136909fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
13701da177e4SLinus Torvalds 	ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf);
137109fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
13721da177e4SLinus Torvalds 
13731da177e4SLinus Torvalds 	BT_DBG("num_rsp %d", ir.num_rsp);
13741da177e4SLinus Torvalds 
13751da177e4SLinus Torvalds 	if (!copy_to_user(ptr, &ir, sizeof(ir))) {
13761da177e4SLinus Torvalds 		ptr += sizeof(ir);
13771da177e4SLinus Torvalds 		if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) *
13781da177e4SLinus Torvalds 				 ir.num_rsp))
13791da177e4SLinus Torvalds 			err = -EFAULT;
13801da177e4SLinus Torvalds 	} else
13811da177e4SLinus Torvalds 		err = -EFAULT;
13821da177e4SLinus Torvalds 
13831da177e4SLinus Torvalds 	kfree(buf);
13841da177e4SLinus Torvalds 
13851da177e4SLinus Torvalds done:
13861da177e4SLinus Torvalds 	hci_dev_put(hdev);
13871da177e4SLinus Torvalds 	return err;
13881da177e4SLinus Torvalds }
13891da177e4SLinus Torvalds 
13907a0e5b15SMatthias Kaehlcke /**
13917a0e5b15SMatthias Kaehlcke  * hci_dev_get_bd_addr_from_property - Get the Bluetooth Device Address
13927a0e5b15SMatthias Kaehlcke  *				       (BD_ADDR) for a HCI device from
13937a0e5b15SMatthias Kaehlcke  *				       a firmware node property.
13947a0e5b15SMatthias Kaehlcke  * @hdev:	The HCI device
13957a0e5b15SMatthias Kaehlcke  *
13967a0e5b15SMatthias Kaehlcke  * Search the firmware node for 'local-bd-address'.
13977a0e5b15SMatthias Kaehlcke  *
13987a0e5b15SMatthias Kaehlcke  * All-zero BD addresses are rejected, because those could be properties
13997a0e5b15SMatthias Kaehlcke  * that exist in the firmware tables, but were not updated by the firmware. For
14007a0e5b15SMatthias Kaehlcke  * example, the DTS could define 'local-bd-address', with zero BD addresses.
14017a0e5b15SMatthias Kaehlcke  */
14027a0e5b15SMatthias Kaehlcke static void hci_dev_get_bd_addr_from_property(struct hci_dev *hdev)
14037a0e5b15SMatthias Kaehlcke {
14047a0e5b15SMatthias Kaehlcke 	struct fwnode_handle *fwnode = dev_fwnode(hdev->dev.parent);
14057a0e5b15SMatthias Kaehlcke 	bdaddr_t ba;
14067a0e5b15SMatthias Kaehlcke 	int ret;
14077a0e5b15SMatthias Kaehlcke 
14087a0e5b15SMatthias Kaehlcke 	ret = fwnode_property_read_u8_array(fwnode, "local-bd-address",
14097a0e5b15SMatthias Kaehlcke 					    (u8 *)&ba, sizeof(ba));
14107a0e5b15SMatthias Kaehlcke 	if (ret < 0 || !bacmp(&ba, BDADDR_ANY))
14117a0e5b15SMatthias Kaehlcke 		return;
14127a0e5b15SMatthias Kaehlcke 
14137a0e5b15SMatthias Kaehlcke 	bacpy(&hdev->public_addr, &ba);
14147a0e5b15SMatthias Kaehlcke }
14157a0e5b15SMatthias Kaehlcke 
1416cbed0ca1SJohan Hedberg static int hci_dev_do_open(struct hci_dev *hdev)
14171da177e4SLinus Torvalds {
14181da177e4SLinus Torvalds 	int ret = 0;
14191da177e4SLinus Torvalds 
14201da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
14211da177e4SLinus Torvalds 
1422b504430cSJohan Hedberg 	hci_req_sync_lock(hdev);
14231da177e4SLinus Torvalds 
1424d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) {
142594324962SJohan Hovold 		ret = -ENODEV;
142694324962SJohan Hovold 		goto done;
142794324962SJohan Hovold 	}
142894324962SJohan Hovold 
1429d7a5a11dSMarcel Holtmann 	if (!hci_dev_test_flag(hdev, HCI_SETUP) &&
1430d7a5a11dSMarcel Holtmann 	    !hci_dev_test_flag(hdev, HCI_CONFIG)) {
1431a5c8f270SMarcel Holtmann 		/* Check for rfkill but allow the HCI setup stage to
1432a5c8f270SMarcel Holtmann 		 * proceed (which in itself doesn't cause any RF activity).
1433bf543036SJohan Hedberg 		 */
1434d7a5a11dSMarcel Holtmann 		if (hci_dev_test_flag(hdev, HCI_RFKILLED)) {
1435611b30f7SMarcel Holtmann 			ret = -ERFKILL;
1436611b30f7SMarcel Holtmann 			goto done;
1437611b30f7SMarcel Holtmann 		}
1438611b30f7SMarcel Holtmann 
1439a5c8f270SMarcel Holtmann 		/* Check for valid public address or a configured static
1440a5c8f270SMarcel Holtmann 		 * random adddress, but let the HCI setup proceed to
1441a5c8f270SMarcel Holtmann 		 * be able to determine if there is a public address
1442a5c8f270SMarcel Holtmann 		 * or not.
1443a5c8f270SMarcel Holtmann 		 *
1444c6beca0eSMarcel Holtmann 		 * In case of user channel usage, it is not important
1445c6beca0eSMarcel Holtmann 		 * if a public address or static random address is
1446c6beca0eSMarcel Holtmann 		 * available.
1447c6beca0eSMarcel Holtmann 		 *
1448a5c8f270SMarcel Holtmann 		 * This check is only valid for BR/EDR controllers
1449a5c8f270SMarcel Holtmann 		 * since AMP controllers do not have an address.
1450a5c8f270SMarcel Holtmann 		 */
1451d7a5a11dSMarcel Holtmann 		if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
1452ca8bee5dSMarcel Holtmann 		    hdev->dev_type == HCI_PRIMARY &&
1453a5c8f270SMarcel Holtmann 		    !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
1454a5c8f270SMarcel Holtmann 		    !bacmp(&hdev->static_addr, BDADDR_ANY)) {
1455a5c8f270SMarcel Holtmann 			ret = -EADDRNOTAVAIL;
1456a5c8f270SMarcel Holtmann 			goto done;
1457a5c8f270SMarcel Holtmann 		}
1458a5c8f270SMarcel Holtmann 	}
1459a5c8f270SMarcel Holtmann 
14601da177e4SLinus Torvalds 	if (test_bit(HCI_UP, &hdev->flags)) {
14611da177e4SLinus Torvalds 		ret = -EALREADY;
14621da177e4SLinus Torvalds 		goto done;
14631da177e4SLinus Torvalds 	}
14641da177e4SLinus Torvalds 
14651da177e4SLinus Torvalds 	if (hdev->open(hdev)) {
14661da177e4SLinus Torvalds 		ret = -EIO;
14671da177e4SLinus Torvalds 		goto done;
14681da177e4SLinus Torvalds 	}
14691da177e4SLinus Torvalds 
1470e9ca8bf1SMarcel Holtmann 	set_bit(HCI_RUNNING, &hdev->flags);
147105fcd4c4SMarcel Holtmann 	hci_sock_dev_event(hdev, HCI_DEV_OPEN);
14724a3f95b7SMarcel Holtmann 
14731da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
14741da177e4SLinus Torvalds 	set_bit(HCI_INIT, &hdev->flags);
1475f41c70c4SMarcel Holtmann 
1476740011cfSSean Wang 	if (hci_dev_test_flag(hdev, HCI_SETUP) ||
1477740011cfSSean Wang 	    test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) {
14787fdf6c6aSMarcel Holtmann 		bool invalid_bdaddr;
14797fdf6c6aSMarcel Holtmann 
1480e131d74aSMarcel Holtmann 		hci_sock_dev_event(hdev, HCI_DEV_SETUP);
1481e131d74aSMarcel Holtmann 
1482af202f84SMarcel Holtmann 		if (hdev->setup)
1483f41c70c4SMarcel Holtmann 			ret = hdev->setup(hdev);
1484f41c70c4SMarcel Holtmann 
14857fdf6c6aSMarcel Holtmann 		/* The transport driver can set the quirk to mark the
14867fdf6c6aSMarcel Holtmann 		 * BD_ADDR invalid before creating the HCI device or in
14877fdf6c6aSMarcel Holtmann 		 * its setup callback.
14887fdf6c6aSMarcel Holtmann 		 */
14897fdf6c6aSMarcel Holtmann 		invalid_bdaddr = test_bit(HCI_QUIRK_INVALID_BDADDR,
14907fdf6c6aSMarcel Holtmann 					  &hdev->quirks);
14917fdf6c6aSMarcel Holtmann 
14927a0e5b15SMatthias Kaehlcke 		if (ret)
14937a0e5b15SMatthias Kaehlcke 			goto setup_failed;
14947a0e5b15SMatthias Kaehlcke 
14957a0e5b15SMatthias Kaehlcke 		if (test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) {
14967a0e5b15SMatthias Kaehlcke 			if (!bacmp(&hdev->public_addr, BDADDR_ANY))
14977a0e5b15SMatthias Kaehlcke 				hci_dev_get_bd_addr_from_property(hdev);
14987a0e5b15SMatthias Kaehlcke 
14997a0e5b15SMatthias Kaehlcke 			if (bacmp(&hdev->public_addr, BDADDR_ANY) &&
15007fdf6c6aSMarcel Holtmann 			    hdev->set_bdaddr) {
15017a0e5b15SMatthias Kaehlcke 				ret = hdev->set_bdaddr(hdev,
15027a0e5b15SMatthias Kaehlcke 						       &hdev->public_addr);
15037fdf6c6aSMarcel Holtmann 
15047fdf6c6aSMarcel Holtmann 				/* If setting of the BD_ADDR from the device
15057fdf6c6aSMarcel Holtmann 				 * property succeeds, then treat the address
15067fdf6c6aSMarcel Holtmann 				 * as valid even if the invalid BD_ADDR
15077fdf6c6aSMarcel Holtmann 				 * quirk indicates otherwise.
15087fdf6c6aSMarcel Holtmann 				 */
15097fdf6c6aSMarcel Holtmann 				if (!ret)
15107fdf6c6aSMarcel Holtmann 					invalid_bdaddr = false;
15117fdf6c6aSMarcel Holtmann 			}
15127a0e5b15SMatthias Kaehlcke 		}
15137a0e5b15SMatthias Kaehlcke 
15147a0e5b15SMatthias Kaehlcke setup_failed:
1515af202f84SMarcel Holtmann 		/* The transport driver can set these quirks before
1516af202f84SMarcel Holtmann 		 * creating the HCI device or in its setup callback.
1517af202f84SMarcel Holtmann 		 *
15187fdf6c6aSMarcel Holtmann 		 * For the invalid BD_ADDR quirk it is possible that
15197fdf6c6aSMarcel Holtmann 		 * it becomes a valid address if the bootloader does
15207fdf6c6aSMarcel Holtmann 		 * provide it (see above).
15217fdf6c6aSMarcel Holtmann 		 *
1522af202f84SMarcel Holtmann 		 * In case any of them is set, the controller has to
1523af202f84SMarcel Holtmann 		 * start up as unconfigured.
1524af202f84SMarcel Holtmann 		 */
1525eb1904f4SMarcel Holtmann 		if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
15267fdf6c6aSMarcel Holtmann 		    invalid_bdaddr)
1527a1536da2SMarcel Holtmann 			hci_dev_set_flag(hdev, HCI_UNCONFIGURED);
1528f41c70c4SMarcel Holtmann 
15290ebca7d6SMarcel Holtmann 		/* For an unconfigured controller it is required to
15300ebca7d6SMarcel Holtmann 		 * read at least the version information provided by
15310ebca7d6SMarcel Holtmann 		 * the Read Local Version Information command.
15320ebca7d6SMarcel Holtmann 		 *
15330ebca7d6SMarcel Holtmann 		 * If the set_bdaddr driver callback is provided, then
15340ebca7d6SMarcel Holtmann 		 * also the original Bluetooth public device address
15350ebca7d6SMarcel Holtmann 		 * will be read using the Read BD Address command.
15360ebca7d6SMarcel Holtmann 		 */
1537d7a5a11dSMarcel Holtmann 		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
15380ebca7d6SMarcel Holtmann 			ret = __hci_unconf_init(hdev);
153989bc22d2SMarcel Holtmann 	}
154089bc22d2SMarcel Holtmann 
1541d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_CONFIG)) {
15429713c17bSMarcel Holtmann 		/* If public address change is configured, ensure that
15439713c17bSMarcel Holtmann 		 * the address gets programmed. If the driver does not
15449713c17bSMarcel Holtmann 		 * support changing the public address, fail the power
15459713c17bSMarcel Holtmann 		 * on procedure.
154624c457e2SMarcel Holtmann 		 */
15479713c17bSMarcel Holtmann 		if (bacmp(&hdev->public_addr, BDADDR_ANY) &&
15489713c17bSMarcel Holtmann 		    hdev->set_bdaddr)
154924c457e2SMarcel Holtmann 			ret = hdev->set_bdaddr(hdev, &hdev->public_addr);
155024c457e2SMarcel Holtmann 		else
155124c457e2SMarcel Holtmann 			ret = -EADDRNOTAVAIL;
155224c457e2SMarcel Holtmann 	}
155324c457e2SMarcel Holtmann 
1554f41c70c4SMarcel Holtmann 	if (!ret) {
1555d7a5a11dSMarcel Holtmann 		if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED) &&
155698a63aafSMarcel Holtmann 		    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
15572177bab5SJohan Hedberg 			ret = __hci_init(hdev);
155898a63aafSMarcel Holtmann 			if (!ret && hdev->post_init)
155998a63aafSMarcel Holtmann 				ret = hdev->post_init(hdev);
156098a63aafSMarcel Holtmann 		}
15611da177e4SLinus Torvalds 	}
15621da177e4SLinus Torvalds 
15637e995b9eSMarcel Holtmann 	/* If the HCI Reset command is clearing all diagnostic settings,
15647e995b9eSMarcel Holtmann 	 * then they need to be reprogrammed after the init procedure
15657e995b9eSMarcel Holtmann 	 * completed.
15667e995b9eSMarcel Holtmann 	 */
15677e995b9eSMarcel Holtmann 	if (test_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks) &&
1568b56c7b25SMarcel Holtmann 	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
15697e995b9eSMarcel Holtmann 	    hci_dev_test_flag(hdev, HCI_VENDOR_DIAG) && hdev->set_diag)
15707e995b9eSMarcel Holtmann 		ret = hdev->set_diag(hdev, true);
15717e995b9eSMarcel Holtmann 
1572145373cbSMiao-chen Chou 	msft_do_open(hdev);
1573145373cbSMiao-chen Chou 
1574f41c70c4SMarcel Holtmann 	clear_bit(HCI_INIT, &hdev->flags);
1575f41c70c4SMarcel Holtmann 
15761da177e4SLinus Torvalds 	if (!ret) {
15771da177e4SLinus Torvalds 		hci_dev_hold(hdev);
1578a1536da2SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
1579a73c046aSJaganath Kanakkassery 		hci_adv_instances_set_rpa_expired(hdev, true);
15801da177e4SLinus Torvalds 		set_bit(HCI_UP, &hdev->flags);
158105fcd4c4SMarcel Holtmann 		hci_sock_dev_event(hdev, HCI_DEV_UP);
15826d5d2ee6SHeiner Kallweit 		hci_leds_update_powered(hdev, true);
1583d7a5a11dSMarcel Holtmann 		if (!hci_dev_test_flag(hdev, HCI_SETUP) &&
1584d7a5a11dSMarcel Holtmann 		    !hci_dev_test_flag(hdev, HCI_CONFIG) &&
1585d7a5a11dSMarcel Holtmann 		    !hci_dev_test_flag(hdev, HCI_UNCONFIGURED) &&
1586d7a5a11dSMarcel Holtmann 		    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
15872ff13894SJohan Hedberg 		    hci_dev_test_flag(hdev, HCI_MGMT) &&
1588ca8bee5dSMarcel Holtmann 		    hdev->dev_type == HCI_PRIMARY) {
15892ff13894SJohan Hedberg 			ret = __hci_req_hci_power_on(hdev);
15902ff13894SJohan Hedberg 			mgmt_power_on(hdev, ret);
159156e5cb86SJohan Hedberg 		}
15921da177e4SLinus Torvalds 	} else {
15931da177e4SLinus Torvalds 		/* Init failed, cleanup */
15943eff45eaSGustavo F. Padovan 		flush_work(&hdev->tx_work);
1595c347b765SGustavo F. Padovan 		flush_work(&hdev->cmd_work);
1596b78752ccSMarcel Holtmann 		flush_work(&hdev->rx_work);
15971da177e4SLinus Torvalds 
15981da177e4SLinus Torvalds 		skb_queue_purge(&hdev->cmd_q);
15991da177e4SLinus Torvalds 		skb_queue_purge(&hdev->rx_q);
16001da177e4SLinus Torvalds 
16011da177e4SLinus Torvalds 		if (hdev->flush)
16021da177e4SLinus Torvalds 			hdev->flush(hdev);
16031da177e4SLinus Torvalds 
16041da177e4SLinus Torvalds 		if (hdev->sent_cmd) {
16051da177e4SLinus Torvalds 			kfree_skb(hdev->sent_cmd);
16061da177e4SLinus Torvalds 			hdev->sent_cmd = NULL;
16071da177e4SLinus Torvalds 		}
16081da177e4SLinus Torvalds 
1609e9ca8bf1SMarcel Holtmann 		clear_bit(HCI_RUNNING, &hdev->flags);
161005fcd4c4SMarcel Holtmann 		hci_sock_dev_event(hdev, HCI_DEV_CLOSE);
16114a3f95b7SMarcel Holtmann 
16121da177e4SLinus Torvalds 		hdev->close(hdev);
1613fee746b0SMarcel Holtmann 		hdev->flags &= BIT(HCI_RAW);
16141da177e4SLinus Torvalds 	}
16151da177e4SLinus Torvalds 
16161da177e4SLinus Torvalds done:
1617b504430cSJohan Hedberg 	hci_req_sync_unlock(hdev);
16181da177e4SLinus Torvalds 	return ret;
16191da177e4SLinus Torvalds }
16201da177e4SLinus Torvalds 
1621cbed0ca1SJohan Hedberg /* ---- HCI ioctl helpers ---- */
1622cbed0ca1SJohan Hedberg 
1623cbed0ca1SJohan Hedberg int hci_dev_open(__u16 dev)
1624cbed0ca1SJohan Hedberg {
1625cbed0ca1SJohan Hedberg 	struct hci_dev *hdev;
1626cbed0ca1SJohan Hedberg 	int err;
1627cbed0ca1SJohan Hedberg 
1628cbed0ca1SJohan Hedberg 	hdev = hci_dev_get(dev);
1629cbed0ca1SJohan Hedberg 	if (!hdev)
1630cbed0ca1SJohan Hedberg 		return -ENODEV;
1631cbed0ca1SJohan Hedberg 
16324a964404SMarcel Holtmann 	/* Devices that are marked as unconfigured can only be powered
1633fee746b0SMarcel Holtmann 	 * up as user channel. Trying to bring them up as normal devices
1634fee746b0SMarcel Holtmann 	 * will result into a failure. Only user channel operation is
1635fee746b0SMarcel Holtmann 	 * possible.
1636fee746b0SMarcel Holtmann 	 *
1637fee746b0SMarcel Holtmann 	 * When this function is called for a user channel, the flag
1638fee746b0SMarcel Holtmann 	 * HCI_USER_CHANNEL will be set first before attempting to
1639fee746b0SMarcel Holtmann 	 * open the device.
1640fee746b0SMarcel Holtmann 	 */
1641d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) &&
1642d7a5a11dSMarcel Holtmann 	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
1643fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
1644fee746b0SMarcel Holtmann 		goto done;
1645fee746b0SMarcel Holtmann 	}
1646fee746b0SMarcel Holtmann 
1647e1d08f40SJohan Hedberg 	/* We need to ensure that no other power on/off work is pending
1648e1d08f40SJohan Hedberg 	 * before proceeding to call hci_dev_do_open. This is
1649e1d08f40SJohan Hedberg 	 * particularly important if the setup procedure has not yet
1650e1d08f40SJohan Hedberg 	 * completed.
1651e1d08f40SJohan Hedberg 	 */
1652a69d8927SMarcel Holtmann 	if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF))
1653e1d08f40SJohan Hedberg 		cancel_delayed_work(&hdev->power_off);
1654e1d08f40SJohan Hedberg 
1655a5c8f270SMarcel Holtmann 	/* After this call it is guaranteed that the setup procedure
1656a5c8f270SMarcel Holtmann 	 * has finished. This means that error conditions like RFKILL
1657a5c8f270SMarcel Holtmann 	 * or no valid public or static random address apply.
1658a5c8f270SMarcel Holtmann 	 */
1659e1d08f40SJohan Hedberg 	flush_workqueue(hdev->req_workqueue);
1660e1d08f40SJohan Hedberg 
166112aa4f0aSMarcel Holtmann 	/* For controllers not using the management interface and that
1662b6ae8457SJohan Hedberg 	 * are brought up using legacy ioctl, set the HCI_BONDABLE bit
166312aa4f0aSMarcel Holtmann 	 * so that pairing works for them. Once the management interface
166412aa4f0aSMarcel Holtmann 	 * is in use this bit will be cleared again and userspace has
166512aa4f0aSMarcel Holtmann 	 * to explicitly enable it.
166612aa4f0aSMarcel Holtmann 	 */
1667d7a5a11dSMarcel Holtmann 	if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
1668d7a5a11dSMarcel Holtmann 	    !hci_dev_test_flag(hdev, HCI_MGMT))
1669a1536da2SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_BONDABLE);
167012aa4f0aSMarcel Holtmann 
1671cbed0ca1SJohan Hedberg 	err = hci_dev_do_open(hdev);
1672cbed0ca1SJohan Hedberg 
1673fee746b0SMarcel Holtmann done:
1674cbed0ca1SJohan Hedberg 	hci_dev_put(hdev);
1675cbed0ca1SJohan Hedberg 	return err;
1676cbed0ca1SJohan Hedberg }
1677cbed0ca1SJohan Hedberg 
1678d7347f3cSJohan Hedberg /* This function requires the caller holds hdev->lock */
1679d7347f3cSJohan Hedberg static void hci_pend_le_actions_clear(struct hci_dev *hdev)
1680d7347f3cSJohan Hedberg {
1681d7347f3cSJohan Hedberg 	struct hci_conn_params *p;
1682d7347f3cSJohan Hedberg 
1683f161dd41SJohan Hedberg 	list_for_each_entry(p, &hdev->le_conn_params, list) {
1684f161dd41SJohan Hedberg 		if (p->conn) {
1685f161dd41SJohan Hedberg 			hci_conn_drop(p->conn);
1686f8aaf9b6SJohan Hedberg 			hci_conn_put(p->conn);
1687f161dd41SJohan Hedberg 			p->conn = NULL;
1688f161dd41SJohan Hedberg 		}
1689d7347f3cSJohan Hedberg 		list_del_init(&p->action);
1690f161dd41SJohan Hedberg 	}
1691d7347f3cSJohan Hedberg 
1692d7347f3cSJohan Hedberg 	BT_DBG("All LE pending actions cleared");
1693d7347f3cSJohan Hedberg }
1694d7347f3cSJohan Hedberg 
16956b3cc1dbSSimon Fels int hci_dev_do_close(struct hci_dev *hdev)
16961da177e4SLinus Torvalds {
1697acc649c6SMarcel Holtmann 	bool auto_off;
1698acc649c6SMarcel Holtmann 
16991da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
17001da177e4SLinus Torvalds 
1701d24d8144SGabriele Mazzotta 	if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
1702867146a0SLoic Poulain 	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
1703d24d8144SGabriele Mazzotta 	    test_bit(HCI_UP, &hdev->flags)) {
1704a44fecbdSTedd Ho-Jeong An 		/* Execute vendor specific shutdown routine */
1705a44fecbdSTedd Ho-Jeong An 		if (hdev->shutdown)
1706a44fecbdSTedd Ho-Jeong An 			hdev->shutdown(hdev);
1707a44fecbdSTedd Ho-Jeong An 	}
1708a44fecbdSTedd Ho-Jeong An 
170978c04c0bSVinicius Costa Gomes 	cancel_delayed_work(&hdev->power_off);
171078c04c0bSVinicius Costa Gomes 
17117df0f73eSJohan Hedberg 	hci_request_cancel_all(hdev);
1712b504430cSJohan Hedberg 	hci_req_sync_lock(hdev);
17131da177e4SLinus Torvalds 
17141da177e4SLinus Torvalds 	if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
171565cc2b49SMarcel Holtmann 		cancel_delayed_work_sync(&hdev->cmd_timer);
1716b504430cSJohan Hedberg 		hci_req_sync_unlock(hdev);
17171da177e4SLinus Torvalds 		return 0;
17181da177e4SLinus Torvalds 	}
17191da177e4SLinus Torvalds 
17206d5d2ee6SHeiner Kallweit 	hci_leds_update_powered(hdev, false);
17216d5d2ee6SHeiner Kallweit 
17223eff45eaSGustavo F. Padovan 	/* Flush RX and TX works */
17233eff45eaSGustavo F. Padovan 	flush_work(&hdev->tx_work);
1724b78752ccSMarcel Holtmann 	flush_work(&hdev->rx_work);
17251da177e4SLinus Torvalds 
172616ab91abSJohan Hedberg 	if (hdev->discov_timeout > 0) {
172716ab91abSJohan Hedberg 		hdev->discov_timeout = 0;
1728a358dc11SMarcel Holtmann 		hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
1729a358dc11SMarcel Holtmann 		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
173016ab91abSJohan Hedberg 	}
173116ab91abSJohan Hedberg 
1732a69d8927SMarcel Holtmann 	if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE))
17337d78525dSJohan Hedberg 		cancel_delayed_work(&hdev->service_cache);
17347d78525dSJohan Hedberg 
1735a73c046aSJaganath Kanakkassery 	if (hci_dev_test_flag(hdev, HCI_MGMT)) {
1736a73c046aSJaganath Kanakkassery 		struct adv_info *adv_instance;
1737a73c046aSJaganath Kanakkassery 
1738d6bfd59cSJohan Hedberg 		cancel_delayed_work_sync(&hdev->rpa_expired);
17397ba8b4beSAndre Guedes 
1740a73c046aSJaganath Kanakkassery 		list_for_each_entry(adv_instance, &hdev->adv_instances, list)
1741a73c046aSJaganath Kanakkassery 			cancel_delayed_work_sync(&adv_instance->rpa_expired_cb);
1742a73c046aSJaganath Kanakkassery 	}
1743a73c046aSJaganath Kanakkassery 
174476727c02SJohan Hedberg 	/* Avoid potential lockdep warnings from the *_flush() calls by
174576727c02SJohan Hedberg 	 * ensuring the workqueue is empty up front.
174676727c02SJohan Hedberg 	 */
174776727c02SJohan Hedberg 	drain_workqueue(hdev->workqueue);
174876727c02SJohan Hedberg 
174909fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
17501aeb9c65SJohan Hedberg 
17518f502f84SJohan Hedberg 	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
17528f502f84SJohan Hedberg 
1753acc649c6SMarcel Holtmann 	auto_off = hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF);
1754acc649c6SMarcel Holtmann 
1755ca8bee5dSMarcel Holtmann 	if (!auto_off && hdev->dev_type == HCI_PRIMARY &&
1756baab7932SMarcel Holtmann 	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
17572ff13894SJohan Hedberg 	    hci_dev_test_flag(hdev, HCI_MGMT))
17582ff13894SJohan Hedberg 		__mgmt_power_off(hdev);
17591aeb9c65SJohan Hedberg 
17601f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
1761d7347f3cSJohan Hedberg 	hci_pend_le_actions_clear(hdev);
1762f161dd41SJohan Hedberg 	hci_conn_hash_flush(hdev);
176309fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
17641da177e4SLinus Torvalds 
176564dae967SMarcel Holtmann 	smp_unregister(hdev);
176664dae967SMarcel Holtmann 
176705fcd4c4SMarcel Holtmann 	hci_sock_dev_event(hdev, HCI_DEV_DOWN);
17681da177e4SLinus Torvalds 
1769145373cbSMiao-chen Chou 	msft_do_close(hdev);
1770145373cbSMiao-chen Chou 
17711da177e4SLinus Torvalds 	if (hdev->flush)
17721da177e4SLinus Torvalds 		hdev->flush(hdev);
17731da177e4SLinus Torvalds 
17741da177e4SLinus Torvalds 	/* Reset device */
17751da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
17761da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
1777acc649c6SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks) &&
1778acc649c6SMarcel Holtmann 	    !auto_off && !hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
17791da177e4SLinus Torvalds 		set_bit(HCI_INIT, &hdev->flags);
17804ebeee2dSJohan Hedberg 		__hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT, NULL);
17811da177e4SLinus Torvalds 		clear_bit(HCI_INIT, &hdev->flags);
17821da177e4SLinus Torvalds 	}
17831da177e4SLinus Torvalds 
1784c347b765SGustavo F. Padovan 	/* flush cmd  work */
1785c347b765SGustavo F. Padovan 	flush_work(&hdev->cmd_work);
17861da177e4SLinus Torvalds 
17871da177e4SLinus Torvalds 	/* Drop queues */
17881da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
17891da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
17901da177e4SLinus Torvalds 	skb_queue_purge(&hdev->raw_q);
17911da177e4SLinus Torvalds 
17921da177e4SLinus Torvalds 	/* Drop last sent command */
17931da177e4SLinus Torvalds 	if (hdev->sent_cmd) {
179465cc2b49SMarcel Holtmann 		cancel_delayed_work_sync(&hdev->cmd_timer);
17951da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
17961da177e4SLinus Torvalds 		hdev->sent_cmd = NULL;
17971da177e4SLinus Torvalds 	}
17981da177e4SLinus Torvalds 
1799e9ca8bf1SMarcel Holtmann 	clear_bit(HCI_RUNNING, &hdev->flags);
180005fcd4c4SMarcel Holtmann 	hci_sock_dev_event(hdev, HCI_DEV_CLOSE);
18014a3f95b7SMarcel Holtmann 
18029952d90eSAbhishek Pandit-Subedi 	if (test_and_clear_bit(SUSPEND_POWERING_DOWN, hdev->suspend_tasks))
18039952d90eSAbhishek Pandit-Subedi 		wake_up(&hdev->suspend_wait_q);
18049952d90eSAbhishek Pandit-Subedi 
18051da177e4SLinus Torvalds 	/* After this point our queues are empty
18061da177e4SLinus Torvalds 	 * and no tasks are scheduled. */
18071da177e4SLinus Torvalds 	hdev->close(hdev);
18081da177e4SLinus Torvalds 
180935b973c9SJohan Hedberg 	/* Clear flags */
1810fee746b0SMarcel Holtmann 	hdev->flags &= BIT(HCI_RAW);
1811eacb44dfSMarcel Holtmann 	hci_dev_clear_volatile_flags(hdev);
181235b973c9SJohan Hedberg 
1813ced5c338SAndrei Emeltchenko 	/* Controller radio is available but is currently powered down */
1814536619e8SMarcel Holtmann 	hdev->amp_status = AMP_STATUS_POWERED_DOWN;
1815ced5c338SAndrei Emeltchenko 
1816e59fda8dSJohan Hedberg 	memset(hdev->eir, 0, sizeof(hdev->eir));
181709b3c3fbSJohan Hedberg 	memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
18187a4cd51dSMarcel Holtmann 	bacpy(&hdev->random_addr, BDADDR_ANY);
1819e59fda8dSJohan Hedberg 
1820b504430cSJohan Hedberg 	hci_req_sync_unlock(hdev);
18211da177e4SLinus Torvalds 
18221da177e4SLinus Torvalds 	hci_dev_put(hdev);
18231da177e4SLinus Torvalds 	return 0;
18241da177e4SLinus Torvalds }
18251da177e4SLinus Torvalds 
18261da177e4SLinus Torvalds int hci_dev_close(__u16 dev)
18271da177e4SLinus Torvalds {
18281da177e4SLinus Torvalds 	struct hci_dev *hdev;
18291da177e4SLinus Torvalds 	int err;
18301da177e4SLinus Torvalds 
183170f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
183270f23020SAndrei Emeltchenko 	if (!hdev)
18331da177e4SLinus Torvalds 		return -ENODEV;
18348ee56540SMarcel Holtmann 
1835d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
18360736cfa8SMarcel Holtmann 		err = -EBUSY;
18370736cfa8SMarcel Holtmann 		goto done;
18380736cfa8SMarcel Holtmann 	}
18390736cfa8SMarcel Holtmann 
1840a69d8927SMarcel Holtmann 	if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF))
18418ee56540SMarcel Holtmann 		cancel_delayed_work(&hdev->power_off);
18428ee56540SMarcel Holtmann 
18431da177e4SLinus Torvalds 	err = hci_dev_do_close(hdev);
18448ee56540SMarcel Holtmann 
18450736cfa8SMarcel Holtmann done:
18461da177e4SLinus Torvalds 	hci_dev_put(hdev);
18471da177e4SLinus Torvalds 	return err;
18481da177e4SLinus Torvalds }
18491da177e4SLinus Torvalds 
18505c912495SMarcel Holtmann static int hci_dev_do_reset(struct hci_dev *hdev)
18511da177e4SLinus Torvalds {
18525c912495SMarcel Holtmann 	int ret;
18531da177e4SLinus Torvalds 
18545c912495SMarcel Holtmann 	BT_DBG("%s %p", hdev->name, hdev);
18551da177e4SLinus Torvalds 
1856b504430cSJohan Hedberg 	hci_req_sync_lock(hdev);
18571da177e4SLinus Torvalds 
18581da177e4SLinus Torvalds 	/* Drop queues */
18591da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
18601da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
18611da177e4SLinus Torvalds 
186276727c02SJohan Hedberg 	/* Avoid potential lockdep warnings from the *_flush() calls by
186376727c02SJohan Hedberg 	 * ensuring the workqueue is empty up front.
186476727c02SJohan Hedberg 	 */
186576727c02SJohan Hedberg 	drain_workqueue(hdev->workqueue);
186676727c02SJohan Hedberg 
186709fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
18681f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
18691da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
187009fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
18711da177e4SLinus Torvalds 
18721da177e4SLinus Torvalds 	if (hdev->flush)
18731da177e4SLinus Torvalds 		hdev->flush(hdev);
18741da177e4SLinus Torvalds 
18751da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
18766ed58ec5SVille Tervo 	hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
18771da177e4SLinus Torvalds 
18784ebeee2dSJohan Hedberg 	ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT, NULL);
18791da177e4SLinus Torvalds 
1880b504430cSJohan Hedberg 	hci_req_sync_unlock(hdev);
18811da177e4SLinus Torvalds 	return ret;
18821da177e4SLinus Torvalds }
18831da177e4SLinus Torvalds 
18845c912495SMarcel Holtmann int hci_dev_reset(__u16 dev)
18855c912495SMarcel Holtmann {
18865c912495SMarcel Holtmann 	struct hci_dev *hdev;
18875c912495SMarcel Holtmann 	int err;
18885c912495SMarcel Holtmann 
18895c912495SMarcel Holtmann 	hdev = hci_dev_get(dev);
18905c912495SMarcel Holtmann 	if (!hdev)
18915c912495SMarcel Holtmann 		return -ENODEV;
18925c912495SMarcel Holtmann 
18935c912495SMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags)) {
18945c912495SMarcel Holtmann 		err = -ENETDOWN;
18955c912495SMarcel Holtmann 		goto done;
18965c912495SMarcel Holtmann 	}
18975c912495SMarcel Holtmann 
1898d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
18995c912495SMarcel Holtmann 		err = -EBUSY;
19005c912495SMarcel Holtmann 		goto done;
19015c912495SMarcel Holtmann 	}
19025c912495SMarcel Holtmann 
1903d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
19045c912495SMarcel Holtmann 		err = -EOPNOTSUPP;
19055c912495SMarcel Holtmann 		goto done;
19065c912495SMarcel Holtmann 	}
19075c912495SMarcel Holtmann 
19085c912495SMarcel Holtmann 	err = hci_dev_do_reset(hdev);
19095c912495SMarcel Holtmann 
19105c912495SMarcel Holtmann done:
19115c912495SMarcel Holtmann 	hci_dev_put(hdev);
19125c912495SMarcel Holtmann 	return err;
19135c912495SMarcel Holtmann }
19145c912495SMarcel Holtmann 
19151da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev)
19161da177e4SLinus Torvalds {
19171da177e4SLinus Torvalds 	struct hci_dev *hdev;
19181da177e4SLinus Torvalds 	int ret = 0;
19191da177e4SLinus Torvalds 
192070f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
192170f23020SAndrei Emeltchenko 	if (!hdev)
19221da177e4SLinus Torvalds 		return -ENODEV;
19231da177e4SLinus Torvalds 
1924d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
19250736cfa8SMarcel Holtmann 		ret = -EBUSY;
19260736cfa8SMarcel Holtmann 		goto done;
19270736cfa8SMarcel Holtmann 	}
19280736cfa8SMarcel Holtmann 
1929d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
1930fee746b0SMarcel Holtmann 		ret = -EOPNOTSUPP;
1931fee746b0SMarcel Holtmann 		goto done;
1932fee746b0SMarcel Holtmann 	}
1933fee746b0SMarcel Holtmann 
19341da177e4SLinus Torvalds 	memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
19351da177e4SLinus Torvalds 
19360736cfa8SMarcel Holtmann done:
19371da177e4SLinus Torvalds 	hci_dev_put(hdev);
19381da177e4SLinus Torvalds 	return ret;
19391da177e4SLinus Torvalds }
19401da177e4SLinus Torvalds 
1941123abc08SJohan Hedberg static void hci_update_scan_state(struct hci_dev *hdev, u8 scan)
1942123abc08SJohan Hedberg {
1943bc6d2d04SJohan Hedberg 	bool conn_changed, discov_changed;
1944123abc08SJohan Hedberg 
1945123abc08SJohan Hedberg 	BT_DBG("%s scan 0x%02x", hdev->name, scan);
1946123abc08SJohan Hedberg 
1947123abc08SJohan Hedberg 	if ((scan & SCAN_PAGE))
1948238be788SMarcel Holtmann 		conn_changed = !hci_dev_test_and_set_flag(hdev,
1949238be788SMarcel Holtmann 							  HCI_CONNECTABLE);
1950123abc08SJohan Hedberg 	else
1951a69d8927SMarcel Holtmann 		conn_changed = hci_dev_test_and_clear_flag(hdev,
1952a69d8927SMarcel Holtmann 							   HCI_CONNECTABLE);
1953123abc08SJohan Hedberg 
1954bc6d2d04SJohan Hedberg 	if ((scan & SCAN_INQUIRY)) {
1955238be788SMarcel Holtmann 		discov_changed = !hci_dev_test_and_set_flag(hdev,
1956238be788SMarcel Holtmann 							    HCI_DISCOVERABLE);
1957bc6d2d04SJohan Hedberg 	} else {
1958a358dc11SMarcel Holtmann 		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1959a69d8927SMarcel Holtmann 		discov_changed = hci_dev_test_and_clear_flag(hdev,
1960a69d8927SMarcel Holtmann 							     HCI_DISCOVERABLE);
1961bc6d2d04SJohan Hedberg 	}
1962bc6d2d04SJohan Hedberg 
1963d7a5a11dSMarcel Holtmann 	if (!hci_dev_test_flag(hdev, HCI_MGMT))
1964123abc08SJohan Hedberg 		return;
1965123abc08SJohan Hedberg 
1966bc6d2d04SJohan Hedberg 	if (conn_changed || discov_changed) {
1967bc6d2d04SJohan Hedberg 		/* In case this was disabled through mgmt */
1968a1536da2SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
1969bc6d2d04SJohan Hedberg 
1970d7a5a11dSMarcel Holtmann 		if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
1971cab054abSJohan Hedberg 			hci_req_update_adv_data(hdev, hdev->cur_adv_instance);
1972bc6d2d04SJohan Hedberg 
1973123abc08SJohan Hedberg 		mgmt_new_settings(hdev);
1974123abc08SJohan Hedberg 	}
1975bc6d2d04SJohan Hedberg }
1976123abc08SJohan Hedberg 
19771da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg)
19781da177e4SLinus Torvalds {
19791da177e4SLinus Torvalds 	struct hci_dev *hdev;
19801da177e4SLinus Torvalds 	struct hci_dev_req dr;
19811da177e4SLinus Torvalds 	int err = 0;
19821da177e4SLinus Torvalds 
19831da177e4SLinus Torvalds 	if (copy_from_user(&dr, arg, sizeof(dr)))
19841da177e4SLinus Torvalds 		return -EFAULT;
19851da177e4SLinus Torvalds 
198670f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dr.dev_id);
198770f23020SAndrei Emeltchenko 	if (!hdev)
19881da177e4SLinus Torvalds 		return -ENODEV;
19891da177e4SLinus Torvalds 
1990d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
19910736cfa8SMarcel Holtmann 		err = -EBUSY;
19920736cfa8SMarcel Holtmann 		goto done;
19930736cfa8SMarcel Holtmann 	}
19940736cfa8SMarcel Holtmann 
1995d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
1996fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
1997fee746b0SMarcel Holtmann 		goto done;
1998fee746b0SMarcel Holtmann 	}
1999fee746b0SMarcel Holtmann 
2000ca8bee5dSMarcel Holtmann 	if (hdev->dev_type != HCI_PRIMARY) {
20015b69bef5SMarcel Holtmann 		err = -EOPNOTSUPP;
20025b69bef5SMarcel Holtmann 		goto done;
20035b69bef5SMarcel Holtmann 	}
20045b69bef5SMarcel Holtmann 
2005d7a5a11dSMarcel Holtmann 	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
200656f87901SJohan Hedberg 		err = -EOPNOTSUPP;
200756f87901SJohan Hedberg 		goto done;
200856f87901SJohan Hedberg 	}
200956f87901SJohan Hedberg 
20101da177e4SLinus Torvalds 	switch (cmd) {
20111da177e4SLinus Torvalds 	case HCISETAUTH:
201201178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
20134ebeee2dSJohan Hedberg 				   HCI_INIT_TIMEOUT, NULL);
20141da177e4SLinus Torvalds 		break;
20151da177e4SLinus Torvalds 
20161da177e4SLinus Torvalds 	case HCISETENCRYPT:
20171da177e4SLinus Torvalds 		if (!lmp_encrypt_capable(hdev)) {
20181da177e4SLinus Torvalds 			err = -EOPNOTSUPP;
20191da177e4SLinus Torvalds 			break;
20201da177e4SLinus Torvalds 		}
20211da177e4SLinus Torvalds 
20221da177e4SLinus Torvalds 		if (!test_bit(HCI_AUTH, &hdev->flags)) {
20231da177e4SLinus Torvalds 			/* Auth must be enabled first */
202401178cd4SJohan Hedberg 			err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
20254ebeee2dSJohan Hedberg 					   HCI_INIT_TIMEOUT, NULL);
20261da177e4SLinus Torvalds 			if (err)
20271da177e4SLinus Torvalds 				break;
20281da177e4SLinus Torvalds 		}
20291da177e4SLinus Torvalds 
203001178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
20314ebeee2dSJohan Hedberg 				   HCI_INIT_TIMEOUT, NULL);
20321da177e4SLinus Torvalds 		break;
20331da177e4SLinus Torvalds 
20341da177e4SLinus Torvalds 	case HCISETSCAN:
203501178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
20364ebeee2dSJohan Hedberg 				   HCI_INIT_TIMEOUT, NULL);
203791a668b0SJohan Hedberg 
2038bc6d2d04SJohan Hedberg 		/* Ensure that the connectable and discoverable states
2039bc6d2d04SJohan Hedberg 		 * get correctly modified as this was a non-mgmt change.
204091a668b0SJohan Hedberg 		 */
2041123abc08SJohan Hedberg 		if (!err)
2042123abc08SJohan Hedberg 			hci_update_scan_state(hdev, dr.dev_opt);
20431da177e4SLinus Torvalds 		break;
20441da177e4SLinus Torvalds 
20451da177e4SLinus Torvalds 	case HCISETLINKPOL:
204601178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
20474ebeee2dSJohan Hedberg 				   HCI_INIT_TIMEOUT, NULL);
20481da177e4SLinus Torvalds 		break;
20491da177e4SLinus Torvalds 
20501da177e4SLinus Torvalds 	case HCISETLINKMODE:
2051e4e8e37cSMarcel Holtmann 		hdev->link_mode = ((__u16) dr.dev_opt) &
2052e4e8e37cSMarcel Holtmann 					(HCI_LM_MASTER | HCI_LM_ACCEPT);
2053e4e8e37cSMarcel Holtmann 		break;
2054e4e8e37cSMarcel Holtmann 
2055e4e8e37cSMarcel Holtmann 	case HCISETPTYPE:
2056b7c23df8SJaganath Kanakkassery 		if (hdev->pkt_type == (__u16) dr.dev_opt)
2057b7c23df8SJaganath Kanakkassery 			break;
2058b7c23df8SJaganath Kanakkassery 
2059e4e8e37cSMarcel Holtmann 		hdev->pkt_type = (__u16) dr.dev_opt;
2060b7c23df8SJaganath Kanakkassery 		mgmt_phy_configuration_changed(hdev, NULL);
20611da177e4SLinus Torvalds 		break;
20621da177e4SLinus Torvalds 
20631da177e4SLinus Torvalds 	case HCISETACLMTU:
20641da177e4SLinus Torvalds 		hdev->acl_mtu  = *((__u16 *) &dr.dev_opt + 1);
20651da177e4SLinus Torvalds 		hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0);
20661da177e4SLinus Torvalds 		break;
20671da177e4SLinus Torvalds 
20681da177e4SLinus Torvalds 	case HCISETSCOMTU:
20691da177e4SLinus Torvalds 		hdev->sco_mtu  = *((__u16 *) &dr.dev_opt + 1);
20701da177e4SLinus Torvalds 		hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0);
20711da177e4SLinus Torvalds 		break;
20721da177e4SLinus Torvalds 
20731da177e4SLinus Torvalds 	default:
20741da177e4SLinus Torvalds 		err = -EINVAL;
20751da177e4SLinus Torvalds 		break;
20761da177e4SLinus Torvalds 	}
2077e4e8e37cSMarcel Holtmann 
20780736cfa8SMarcel Holtmann done:
20791da177e4SLinus Torvalds 	hci_dev_put(hdev);
20801da177e4SLinus Torvalds 	return err;
20811da177e4SLinus Torvalds }
20821da177e4SLinus Torvalds 
20831da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg)
20841da177e4SLinus Torvalds {
20858035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev;
20861da177e4SLinus Torvalds 	struct hci_dev_list_req *dl;
20871da177e4SLinus Torvalds 	struct hci_dev_req *dr;
20881da177e4SLinus Torvalds 	int n = 0, size, err;
20891da177e4SLinus Torvalds 	__u16 dev_num;
20901da177e4SLinus Torvalds 
20911da177e4SLinus Torvalds 	if (get_user(dev_num, (__u16 __user *) arg))
20921da177e4SLinus Torvalds 		return -EFAULT;
20931da177e4SLinus Torvalds 
20941da177e4SLinus Torvalds 	if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr))
20951da177e4SLinus Torvalds 		return -EINVAL;
20961da177e4SLinus Torvalds 
20971da177e4SLinus Torvalds 	size = sizeof(*dl) + dev_num * sizeof(*dr);
20981da177e4SLinus Torvalds 
209970f23020SAndrei Emeltchenko 	dl = kzalloc(size, GFP_KERNEL);
210070f23020SAndrei Emeltchenko 	if (!dl)
21011da177e4SLinus Torvalds 		return -ENOMEM;
21021da177e4SLinus Torvalds 
21031da177e4SLinus Torvalds 	dr = dl->dev_req;
21041da177e4SLinus Torvalds 
2105f20d09d5SGustavo F. Padovan 	read_lock(&hci_dev_list_lock);
21068035ded4SLuiz Augusto von Dentz 	list_for_each_entry(hdev, &hci_dev_list, list) {
21072e84d8dbSMarcel Holtmann 		unsigned long flags = hdev->flags;
2108c542a06cSJohan Hedberg 
21092e84d8dbSMarcel Holtmann 		/* When the auto-off is configured it means the transport
21102e84d8dbSMarcel Holtmann 		 * is running, but in that case still indicate that the
21112e84d8dbSMarcel Holtmann 		 * device is actually down.
21122e84d8dbSMarcel Holtmann 		 */
2113d7a5a11dSMarcel Holtmann 		if (hci_dev_test_flag(hdev, HCI_AUTO_OFF))
21142e84d8dbSMarcel Holtmann 			flags &= ~BIT(HCI_UP);
2115c542a06cSJohan Hedberg 
21161da177e4SLinus Torvalds 		(dr + n)->dev_id  = hdev->id;
21172e84d8dbSMarcel Holtmann 		(dr + n)->dev_opt = flags;
2118c542a06cSJohan Hedberg 
21191da177e4SLinus Torvalds 		if (++n >= dev_num)
21201da177e4SLinus Torvalds 			break;
21211da177e4SLinus Torvalds 	}
2122f20d09d5SGustavo F. Padovan 	read_unlock(&hci_dev_list_lock);
21231da177e4SLinus Torvalds 
21241da177e4SLinus Torvalds 	dl->dev_num = n;
21251da177e4SLinus Torvalds 	size = sizeof(*dl) + n * sizeof(*dr);
21261da177e4SLinus Torvalds 
21271da177e4SLinus Torvalds 	err = copy_to_user(arg, dl, size);
21281da177e4SLinus Torvalds 	kfree(dl);
21291da177e4SLinus Torvalds 
21301da177e4SLinus Torvalds 	return err ? -EFAULT : 0;
21311da177e4SLinus Torvalds }
21321da177e4SLinus Torvalds 
21331da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg)
21341da177e4SLinus Torvalds {
21351da177e4SLinus Torvalds 	struct hci_dev *hdev;
21361da177e4SLinus Torvalds 	struct hci_dev_info di;
21372e84d8dbSMarcel Holtmann 	unsigned long flags;
21381da177e4SLinus Torvalds 	int err = 0;
21391da177e4SLinus Torvalds 
21401da177e4SLinus Torvalds 	if (copy_from_user(&di, arg, sizeof(di)))
21411da177e4SLinus Torvalds 		return -EFAULT;
21421da177e4SLinus Torvalds 
214370f23020SAndrei Emeltchenko 	hdev = hci_dev_get(di.dev_id);
214470f23020SAndrei Emeltchenko 	if (!hdev)
21451da177e4SLinus Torvalds 		return -ENODEV;
21461da177e4SLinus Torvalds 
21472e84d8dbSMarcel Holtmann 	/* When the auto-off is configured it means the transport
21482e84d8dbSMarcel Holtmann 	 * is running, but in that case still indicate that the
21492e84d8dbSMarcel Holtmann 	 * device is actually down.
21502e84d8dbSMarcel Holtmann 	 */
2151d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_AUTO_OFF))
21522e84d8dbSMarcel Holtmann 		flags = hdev->flags & ~BIT(HCI_UP);
21532e84d8dbSMarcel Holtmann 	else
21542e84d8dbSMarcel Holtmann 		flags = hdev->flags;
2155c542a06cSJohan Hedberg 
21561da177e4SLinus Torvalds 	strcpy(di.name, hdev->name);
21571da177e4SLinus Torvalds 	di.bdaddr   = hdev->bdaddr;
215860f2a3edSMarcel Holtmann 	di.type     = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4);
21592e84d8dbSMarcel Holtmann 	di.flags    = flags;
21601da177e4SLinus Torvalds 	di.pkt_type = hdev->pkt_type;
2161572c7f84SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
21621da177e4SLinus Torvalds 		di.acl_mtu  = hdev->acl_mtu;
21631da177e4SLinus Torvalds 		di.acl_pkts = hdev->acl_pkts;
21641da177e4SLinus Torvalds 		di.sco_mtu  = hdev->sco_mtu;
21651da177e4SLinus Torvalds 		di.sco_pkts = hdev->sco_pkts;
2166572c7f84SJohan Hedberg 	} else {
2167572c7f84SJohan Hedberg 		di.acl_mtu  = hdev->le_mtu;
2168572c7f84SJohan Hedberg 		di.acl_pkts = hdev->le_pkts;
2169572c7f84SJohan Hedberg 		di.sco_mtu  = 0;
2170572c7f84SJohan Hedberg 		di.sco_pkts = 0;
2171572c7f84SJohan Hedberg 	}
21721da177e4SLinus Torvalds 	di.link_policy = hdev->link_policy;
21731da177e4SLinus Torvalds 	di.link_mode   = hdev->link_mode;
21741da177e4SLinus Torvalds 
21751da177e4SLinus Torvalds 	memcpy(&di.stat, &hdev->stat, sizeof(di.stat));
21761da177e4SLinus Torvalds 	memcpy(&di.features, &hdev->features, sizeof(di.features));
21771da177e4SLinus Torvalds 
21781da177e4SLinus Torvalds 	if (copy_to_user(arg, &di, sizeof(di)))
21791da177e4SLinus Torvalds 		err = -EFAULT;
21801da177e4SLinus Torvalds 
21811da177e4SLinus Torvalds 	hci_dev_put(hdev);
21821da177e4SLinus Torvalds 
21831da177e4SLinus Torvalds 	return err;
21841da177e4SLinus Torvalds }
21851da177e4SLinus Torvalds 
21861da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */
21871da177e4SLinus Torvalds 
2188611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked)
2189611b30f7SMarcel Holtmann {
2190611b30f7SMarcel Holtmann 	struct hci_dev *hdev = data;
2191611b30f7SMarcel Holtmann 
2192611b30f7SMarcel Holtmann 	BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
2193611b30f7SMarcel Holtmann 
2194d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL))
21950736cfa8SMarcel Holtmann 		return -EBUSY;
21960736cfa8SMarcel Holtmann 
21975e130367SJohan Hedberg 	if (blocked) {
2198a1536da2SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_RFKILLED);
2199d7a5a11dSMarcel Holtmann 		if (!hci_dev_test_flag(hdev, HCI_SETUP) &&
2200d7a5a11dSMarcel Holtmann 		    !hci_dev_test_flag(hdev, HCI_CONFIG))
2201611b30f7SMarcel Holtmann 			hci_dev_do_close(hdev);
22025e130367SJohan Hedberg 	} else {
2203a358dc11SMarcel Holtmann 		hci_dev_clear_flag(hdev, HCI_RFKILLED);
22045e130367SJohan Hedberg 	}
2205611b30f7SMarcel Holtmann 
2206611b30f7SMarcel Holtmann 	return 0;
2207611b30f7SMarcel Holtmann }
2208611b30f7SMarcel Holtmann 
2209611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = {
2210611b30f7SMarcel Holtmann 	.set_block = hci_rfkill_set_block,
2211611b30f7SMarcel Holtmann };
2212611b30f7SMarcel Holtmann 
2213ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work)
2214ab81cbf9SJohan Hedberg {
2215ab81cbf9SJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev, power_on);
221696570ffcSJohan Hedberg 	int err;
2217ab81cbf9SJohan Hedberg 
2218ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
2219ab81cbf9SJohan Hedberg 
22202ff13894SJohan Hedberg 	if (test_bit(HCI_UP, &hdev->flags) &&
22212ff13894SJohan Hedberg 	    hci_dev_test_flag(hdev, HCI_MGMT) &&
22222ff13894SJohan Hedberg 	    hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) {
2223d82142a8SWei-Ning Huang 		cancel_delayed_work(&hdev->power_off);
22242ff13894SJohan Hedberg 		hci_req_sync_lock(hdev);
22252ff13894SJohan Hedberg 		err = __hci_req_hci_power_on(hdev);
22262ff13894SJohan Hedberg 		hci_req_sync_unlock(hdev);
22272ff13894SJohan Hedberg 		mgmt_power_on(hdev, err);
22282ff13894SJohan Hedberg 		return;
22292ff13894SJohan Hedberg 	}
22302ff13894SJohan Hedberg 
2231cbed0ca1SJohan Hedberg 	err = hci_dev_do_open(hdev);
223296570ffcSJohan Hedberg 	if (err < 0) {
22333ad67582SJaganath Kanakkassery 		hci_dev_lock(hdev);
223496570ffcSJohan Hedberg 		mgmt_set_powered_failed(hdev, err);
22353ad67582SJaganath Kanakkassery 		hci_dev_unlock(hdev);
2236ab81cbf9SJohan Hedberg 		return;
223796570ffcSJohan Hedberg 	}
2238ab81cbf9SJohan Hedberg 
2239a5c8f270SMarcel Holtmann 	/* During the HCI setup phase, a few error conditions are
2240a5c8f270SMarcel Holtmann 	 * ignored and they need to be checked now. If they are still
2241a5c8f270SMarcel Holtmann 	 * valid, it is important to turn the device back off.
2242a5c8f270SMarcel Holtmann 	 */
2243d7a5a11dSMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_RFKILLED) ||
2244d7a5a11dSMarcel Holtmann 	    hci_dev_test_flag(hdev, HCI_UNCONFIGURED) ||
2245ca8bee5dSMarcel Holtmann 	    (hdev->dev_type == HCI_PRIMARY &&
2246a5c8f270SMarcel Holtmann 	     !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
2247a5c8f270SMarcel Holtmann 	     !bacmp(&hdev->static_addr, BDADDR_ANY))) {
2248a358dc11SMarcel Holtmann 		hci_dev_clear_flag(hdev, HCI_AUTO_OFF);
2249bf543036SJohan Hedberg 		hci_dev_do_close(hdev);
2250d7a5a11dSMarcel Holtmann 	} else if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) {
225119202573SJohan Hedberg 		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
225219202573SJohan Hedberg 				   HCI_AUTO_OFF_TIMEOUT);
2253bf543036SJohan Hedberg 	}
2254ab81cbf9SJohan Hedberg 
2255a69d8927SMarcel Holtmann 	if (hci_dev_test_and_clear_flag(hdev, HCI_SETUP)) {
22564a964404SMarcel Holtmann 		/* For unconfigured devices, set the HCI_RAW flag
22574a964404SMarcel Holtmann 		 * so that userspace can easily identify them.
22584a964404SMarcel Holtmann 		 */
2259d7a5a11dSMarcel Holtmann 		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
22604a964404SMarcel Holtmann 			set_bit(HCI_RAW, &hdev->flags);
22610602a8adSMarcel Holtmann 
22620602a8adSMarcel Holtmann 		/* For fully configured devices, this will send
22630602a8adSMarcel Holtmann 		 * the Index Added event. For unconfigured devices,
22640602a8adSMarcel Holtmann 		 * it will send Unconfigued Index Added event.
22650602a8adSMarcel Holtmann 		 *
22660602a8adSMarcel Holtmann 		 * Devices with HCI_QUIRK_RAW_DEVICE are ignored
22670602a8adSMarcel Holtmann 		 * and no event will be send.
22680602a8adSMarcel Holtmann 		 */
2269744cf19eSJohan Hedberg 		mgmt_index_added(hdev);
2270a69d8927SMarcel Holtmann 	} else if (hci_dev_test_and_clear_flag(hdev, HCI_CONFIG)) {
22715ea234d3SMarcel Holtmann 		/* When the controller is now configured, then it
22725ea234d3SMarcel Holtmann 		 * is important to clear the HCI_RAW flag.
22735ea234d3SMarcel Holtmann 		 */
2274d7a5a11dSMarcel Holtmann 		if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
22755ea234d3SMarcel Holtmann 			clear_bit(HCI_RAW, &hdev->flags);
22765ea234d3SMarcel Holtmann 
2277d603b76bSMarcel Holtmann 		/* Powering on the controller with HCI_CONFIG set only
2278d603b76bSMarcel Holtmann 		 * happens with the transition from unconfigured to
2279d603b76bSMarcel Holtmann 		 * configured. This will send the Index Added event.
2280d603b76bSMarcel Holtmann 		 */
2281d603b76bSMarcel Holtmann 		mgmt_index_added(hdev);
2282ab81cbf9SJohan Hedberg 	}
2283ab81cbf9SJohan Hedberg }
2284ab81cbf9SJohan Hedberg 
2285ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work)
2286ab81cbf9SJohan Hedberg {
22873243553fSJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev,
22883243553fSJohan Hedberg 					    power_off.work);
2289ab81cbf9SJohan Hedberg 
2290ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
2291ab81cbf9SJohan Hedberg 
22928ee56540SMarcel Holtmann 	hci_dev_do_close(hdev);
2293ab81cbf9SJohan Hedberg }
2294ab81cbf9SJohan Hedberg 
2295c7741d16SMarcel Holtmann static void hci_error_reset(struct work_struct *work)
2296c7741d16SMarcel Holtmann {
2297c7741d16SMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev, error_reset);
2298c7741d16SMarcel Holtmann 
2299c7741d16SMarcel Holtmann 	BT_DBG("%s", hdev->name);
2300c7741d16SMarcel Holtmann 
2301c7741d16SMarcel Holtmann 	if (hdev->hw_error)
2302c7741d16SMarcel Holtmann 		hdev->hw_error(hdev, hdev->hw_error_code);
2303c7741d16SMarcel Holtmann 	else
23042064ee33SMarcel Holtmann 		bt_dev_err(hdev, "hardware error 0x%2.2x", hdev->hw_error_code);
2305c7741d16SMarcel Holtmann 
2306c7741d16SMarcel Holtmann 	if (hci_dev_do_close(hdev))
2307c7741d16SMarcel Holtmann 		return;
2308c7741d16SMarcel Holtmann 
2309c7741d16SMarcel Holtmann 	hci_dev_do_open(hdev);
2310c7741d16SMarcel Holtmann }
2311c7741d16SMarcel Holtmann 
231235f7498aSJohan Hedberg void hci_uuids_clear(struct hci_dev *hdev)
23132aeb9a1aSJohan Hedberg {
23144821002cSJohan Hedberg 	struct bt_uuid *uuid, *tmp;
23152aeb9a1aSJohan Hedberg 
23164821002cSJohan Hedberg 	list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) {
23174821002cSJohan Hedberg 		list_del(&uuid->list);
23182aeb9a1aSJohan Hedberg 		kfree(uuid);
23192aeb9a1aSJohan Hedberg 	}
23202aeb9a1aSJohan Hedberg }
23212aeb9a1aSJohan Hedberg 
232235f7498aSJohan Hedberg void hci_link_keys_clear(struct hci_dev *hdev)
232355ed8ca1SJohan Hedberg {
232455ed8ca1SJohan Hedberg 	struct link_key *key;
232555ed8ca1SJohan Hedberg 
2326d7d41682SMadhuparna Bhowmik 	list_for_each_entry(key, &hdev->link_keys, list) {
23270378b597SJohan Hedberg 		list_del_rcu(&key->list);
23280378b597SJohan Hedberg 		kfree_rcu(key, rcu);
232955ed8ca1SJohan Hedberg 	}
233055ed8ca1SJohan Hedberg }
233155ed8ca1SJohan Hedberg 
233235f7498aSJohan Hedberg void hci_smp_ltks_clear(struct hci_dev *hdev)
2333b899efafSVinicius Costa Gomes {
2334970d0f1bSJohan Hedberg 	struct smp_ltk *k;
2335b899efafSVinicius Costa Gomes 
2336d7d41682SMadhuparna Bhowmik 	list_for_each_entry(k, &hdev->long_term_keys, list) {
2337970d0f1bSJohan Hedberg 		list_del_rcu(&k->list);
2338970d0f1bSJohan Hedberg 		kfree_rcu(k, rcu);
2339b899efafSVinicius Costa Gomes 	}
2340b899efafSVinicius Costa Gomes }
2341b899efafSVinicius Costa Gomes 
2342970c4e46SJohan Hedberg void hci_smp_irks_clear(struct hci_dev *hdev)
2343970c4e46SJohan Hedberg {
2344adae20cbSJohan Hedberg 	struct smp_irk *k;
2345970c4e46SJohan Hedberg 
2346d7d41682SMadhuparna Bhowmik 	list_for_each_entry(k, &hdev->identity_resolving_keys, list) {
2347adae20cbSJohan Hedberg 		list_del_rcu(&k->list);
2348adae20cbSJohan Hedberg 		kfree_rcu(k, rcu);
2349970c4e46SJohan Hedberg 	}
2350970c4e46SJohan Hedberg }
2351970c4e46SJohan Hedberg 
2352600a8749SAlain Michaud void hci_blocked_keys_clear(struct hci_dev *hdev)
2353600a8749SAlain Michaud {
2354600a8749SAlain Michaud 	struct blocked_key *b;
2355600a8749SAlain Michaud 
2356d7d41682SMadhuparna Bhowmik 	list_for_each_entry(b, &hdev->blocked_keys, list) {
2357600a8749SAlain Michaud 		list_del_rcu(&b->list);
2358600a8749SAlain Michaud 		kfree_rcu(b, rcu);
2359600a8749SAlain Michaud 	}
2360600a8749SAlain Michaud }
2361600a8749SAlain Michaud 
2362600a8749SAlain Michaud bool hci_is_blocked_key(struct hci_dev *hdev, u8 type, u8 val[16])
2363600a8749SAlain Michaud {
2364600a8749SAlain Michaud 	bool blocked = false;
2365600a8749SAlain Michaud 	struct blocked_key *b;
2366600a8749SAlain Michaud 
2367600a8749SAlain Michaud 	rcu_read_lock();
23680c2ac7d4SMadhuparna Bhowmik 	list_for_each_entry_rcu(b, &hdev->blocked_keys, list) {
2369600a8749SAlain Michaud 		if (b->type == type && !memcmp(b->val, val, sizeof(b->val))) {
2370600a8749SAlain Michaud 			blocked = true;
2371600a8749SAlain Michaud 			break;
2372600a8749SAlain Michaud 		}
2373600a8749SAlain Michaud 	}
2374600a8749SAlain Michaud 
2375600a8749SAlain Michaud 	rcu_read_unlock();
2376600a8749SAlain Michaud 	return blocked;
2377600a8749SAlain Michaud }
2378600a8749SAlain Michaud 
237955ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
238055ed8ca1SJohan Hedberg {
238155ed8ca1SJohan Hedberg 	struct link_key *k;
238255ed8ca1SJohan Hedberg 
23830378b597SJohan Hedberg 	rcu_read_lock();
23840378b597SJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->link_keys, list) {
23850378b597SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) == 0) {
23860378b597SJohan Hedberg 			rcu_read_unlock();
2387600a8749SAlain Michaud 
2388600a8749SAlain Michaud 			if (hci_is_blocked_key(hdev,
2389600a8749SAlain Michaud 					       HCI_BLOCKED_KEY_TYPE_LINKKEY,
2390600a8749SAlain Michaud 					       k->val)) {
2391600a8749SAlain Michaud 				bt_dev_warn_ratelimited(hdev,
2392600a8749SAlain Michaud 							"Link key blocked for %pMR",
2393600a8749SAlain Michaud 							&k->bdaddr);
2394600a8749SAlain Michaud 				return NULL;
2395600a8749SAlain Michaud 			}
2396600a8749SAlain Michaud 
239755ed8ca1SJohan Hedberg 			return k;
23980378b597SJohan Hedberg 		}
23990378b597SJohan Hedberg 	}
24000378b597SJohan Hedberg 	rcu_read_unlock();
240155ed8ca1SJohan Hedberg 
240255ed8ca1SJohan Hedberg 	return NULL;
240355ed8ca1SJohan Hedberg }
240455ed8ca1SJohan Hedberg 
2405745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
2406d25e28abSJohan Hedberg 			       u8 key_type, u8 old_key_type)
2407d25e28abSJohan Hedberg {
2408d25e28abSJohan Hedberg 	/* Legacy key */
2409d25e28abSJohan Hedberg 	if (key_type < 0x03)
2410745c0ce3SVishal Agarwal 		return true;
2411d25e28abSJohan Hedberg 
2412d25e28abSJohan Hedberg 	/* Debug keys are insecure so don't store them persistently */
2413d25e28abSJohan Hedberg 	if (key_type == HCI_LK_DEBUG_COMBINATION)
2414745c0ce3SVishal Agarwal 		return false;
2415d25e28abSJohan Hedberg 
2416d25e28abSJohan Hedberg 	/* Changed combination key and there's no previous one */
2417d25e28abSJohan Hedberg 	if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff)
2418745c0ce3SVishal Agarwal 		return false;
2419d25e28abSJohan Hedberg 
2420d25e28abSJohan Hedberg 	/* Security mode 3 case */
2421d25e28abSJohan Hedberg 	if (!conn)
2422745c0ce3SVishal Agarwal 		return true;
2423d25e28abSJohan Hedberg 
2424e3befab9SJohan Hedberg 	/* BR/EDR key derived using SC from an LE link */
2425e3befab9SJohan Hedberg 	if (conn->type == LE_LINK)
2426e3befab9SJohan Hedberg 		return true;
2427e3befab9SJohan Hedberg 
2428d25e28abSJohan Hedberg 	/* Neither local nor remote side had no-bonding as requirement */
2429d25e28abSJohan Hedberg 	if (conn->auth_type > 0x01 && conn->remote_auth > 0x01)
2430745c0ce3SVishal Agarwal 		return true;
2431d25e28abSJohan Hedberg 
2432d25e28abSJohan Hedberg 	/* Local side had dedicated bonding as requirement */
2433d25e28abSJohan Hedberg 	if (conn->auth_type == 0x02 || conn->auth_type == 0x03)
2434745c0ce3SVishal Agarwal 		return true;
2435d25e28abSJohan Hedberg 
2436d25e28abSJohan Hedberg 	/* Remote side had dedicated bonding as requirement */
2437d25e28abSJohan Hedberg 	if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03)
2438745c0ce3SVishal Agarwal 		return true;
2439d25e28abSJohan Hedberg 
2440d25e28abSJohan Hedberg 	/* If none of the above criteria match, then don't store the key
2441d25e28abSJohan Hedberg 	 * persistently */
2442745c0ce3SVishal Agarwal 	return false;
2443d25e28abSJohan Hedberg }
2444d25e28abSJohan Hedberg 
2445e804d25dSJohan Hedberg static u8 ltk_role(u8 type)
244698a0b845SJohan Hedberg {
2447e804d25dSJohan Hedberg 	if (type == SMP_LTK)
2448e804d25dSJohan Hedberg 		return HCI_ROLE_MASTER;
244998a0b845SJohan Hedberg 
2450e804d25dSJohan Hedberg 	return HCI_ROLE_SLAVE;
245198a0b845SJohan Hedberg }
245298a0b845SJohan Hedberg 
2453f3a73d97SJohan Hedberg struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
2454e804d25dSJohan Hedberg 			     u8 addr_type, u8 role)
245575d262c2SVinicius Costa Gomes {
2456c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
245775d262c2SVinicius Costa Gomes 
2458970d0f1bSJohan Hedberg 	rcu_read_lock();
2459970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
24605378bc56SJohan Hedberg 		if (addr_type != k->bdaddr_type || bacmp(bdaddr, &k->bdaddr))
24615378bc56SJohan Hedberg 			continue;
24625378bc56SJohan Hedberg 
2463923e2414SJohan Hedberg 		if (smp_ltk_is_sc(k) || ltk_role(k->type) == role) {
2464970d0f1bSJohan Hedberg 			rcu_read_unlock();
2465600a8749SAlain Michaud 
2466600a8749SAlain Michaud 			if (hci_is_blocked_key(hdev, HCI_BLOCKED_KEY_TYPE_LTK,
2467600a8749SAlain Michaud 					       k->val)) {
2468600a8749SAlain Michaud 				bt_dev_warn_ratelimited(hdev,
2469600a8749SAlain Michaud 							"LTK blocked for %pMR",
2470600a8749SAlain Michaud 							&k->bdaddr);
2471600a8749SAlain Michaud 				return NULL;
2472600a8749SAlain Michaud 			}
2473600a8749SAlain Michaud 
247475d262c2SVinicius Costa Gomes 			return k;
2475970d0f1bSJohan Hedberg 		}
2476970d0f1bSJohan Hedberg 	}
2477970d0f1bSJohan Hedberg 	rcu_read_unlock();
247875d262c2SVinicius Costa Gomes 
247975d262c2SVinicius Costa Gomes 	return NULL;
248075d262c2SVinicius Costa Gomes }
248175d262c2SVinicius Costa Gomes 
2482970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa)
2483970c4e46SJohan Hedberg {
2484600a8749SAlain Michaud 	struct smp_irk *irk_to_return = NULL;
2485970c4e46SJohan Hedberg 	struct smp_irk *irk;
2486970c4e46SJohan Hedberg 
2487adae20cbSJohan Hedberg 	rcu_read_lock();
2488adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
2489adae20cbSJohan Hedberg 		if (!bacmp(&irk->rpa, rpa)) {
2490600a8749SAlain Michaud 			irk_to_return = irk;
2491600a8749SAlain Michaud 			goto done;
2492970c4e46SJohan Hedberg 		}
2493adae20cbSJohan Hedberg 	}
2494970c4e46SJohan Hedberg 
2495adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
2496defce9e8SJohan Hedberg 		if (smp_irk_matches(hdev, irk->val, rpa)) {
2497970c4e46SJohan Hedberg 			bacpy(&irk->rpa, rpa);
2498600a8749SAlain Michaud 			irk_to_return = irk;
2499600a8749SAlain Michaud 			goto done;
2500970c4e46SJohan Hedberg 		}
2501970c4e46SJohan Hedberg 	}
2502600a8749SAlain Michaud 
2503600a8749SAlain Michaud done:
2504600a8749SAlain Michaud 	if (irk_to_return && hci_is_blocked_key(hdev, HCI_BLOCKED_KEY_TYPE_IRK,
2505600a8749SAlain Michaud 						irk_to_return->val)) {
2506600a8749SAlain Michaud 		bt_dev_warn_ratelimited(hdev, "Identity key blocked for %pMR",
2507600a8749SAlain Michaud 					&irk_to_return->bdaddr);
2508600a8749SAlain Michaud 		irk_to_return = NULL;
2509600a8749SAlain Michaud 	}
2510600a8749SAlain Michaud 
2511adae20cbSJohan Hedberg 	rcu_read_unlock();
2512970c4e46SJohan Hedberg 
2513600a8749SAlain Michaud 	return irk_to_return;
2514970c4e46SJohan Hedberg }
2515970c4e46SJohan Hedberg 
2516970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
2517970c4e46SJohan Hedberg 				     u8 addr_type)
2518970c4e46SJohan Hedberg {
2519600a8749SAlain Michaud 	struct smp_irk *irk_to_return = NULL;
2520970c4e46SJohan Hedberg 	struct smp_irk *irk;
2521970c4e46SJohan Hedberg 
25226cfc9988SJohan Hedberg 	/* Identity Address must be public or static random */
25236cfc9988SJohan Hedberg 	if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0)
25246cfc9988SJohan Hedberg 		return NULL;
25256cfc9988SJohan Hedberg 
2526adae20cbSJohan Hedberg 	rcu_read_lock();
2527adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
2528970c4e46SJohan Hedberg 		if (addr_type == irk->addr_type &&
2529adae20cbSJohan Hedberg 		    bacmp(bdaddr, &irk->bdaddr) == 0) {
2530600a8749SAlain Michaud 			irk_to_return = irk;
2531600a8749SAlain Michaud 			goto done;
2532970c4e46SJohan Hedberg 		}
2533adae20cbSJohan Hedberg 	}
2534600a8749SAlain Michaud 
2535600a8749SAlain Michaud done:
2536600a8749SAlain Michaud 
2537600a8749SAlain Michaud 	if (irk_to_return && hci_is_blocked_key(hdev, HCI_BLOCKED_KEY_TYPE_IRK,
2538600a8749SAlain Michaud 						irk_to_return->val)) {
2539600a8749SAlain Michaud 		bt_dev_warn_ratelimited(hdev, "Identity key blocked for %pMR",
2540600a8749SAlain Michaud 					&irk_to_return->bdaddr);
2541600a8749SAlain Michaud 		irk_to_return = NULL;
2542600a8749SAlain Michaud 	}
2543600a8749SAlain Michaud 
2544adae20cbSJohan Hedberg 	rcu_read_unlock();
2545970c4e46SJohan Hedberg 
2546600a8749SAlain Michaud 	return irk_to_return;
2547970c4e46SJohan Hedberg }
2548970c4e46SJohan Hedberg 
2549567fa2aaSJohan Hedberg struct link_key *hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn,
25507652ff6aSJohan Hedberg 				  bdaddr_t *bdaddr, u8 *val, u8 type,
25517652ff6aSJohan Hedberg 				  u8 pin_len, bool *persistent)
255255ed8ca1SJohan Hedberg {
255355ed8ca1SJohan Hedberg 	struct link_key *key, *old_key;
2554745c0ce3SVishal Agarwal 	u8 old_key_type;
255555ed8ca1SJohan Hedberg 
255655ed8ca1SJohan Hedberg 	old_key = hci_find_link_key(hdev, bdaddr);
255755ed8ca1SJohan Hedberg 	if (old_key) {
255855ed8ca1SJohan Hedberg 		old_key_type = old_key->type;
255955ed8ca1SJohan Hedberg 		key = old_key;
256055ed8ca1SJohan Hedberg 	} else {
256112adcf3aSJohan Hedberg 		old_key_type = conn ? conn->key_type : 0xff;
25620a14ab41SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_KERNEL);
256355ed8ca1SJohan Hedberg 		if (!key)
2564567fa2aaSJohan Hedberg 			return NULL;
25650378b597SJohan Hedberg 		list_add_rcu(&key->list, &hdev->link_keys);
256655ed8ca1SJohan Hedberg 	}
256755ed8ca1SJohan Hedberg 
25686ed93dc6SAndrei Emeltchenko 	BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type);
256955ed8ca1SJohan Hedberg 
2570d25e28abSJohan Hedberg 	/* Some buggy controller combinations generate a changed
2571d25e28abSJohan Hedberg 	 * combination key for legacy pairing even when there's no
2572d25e28abSJohan Hedberg 	 * previous key */
2573d25e28abSJohan Hedberg 	if (type == HCI_LK_CHANGED_COMBINATION &&
2574a8c5fb1aSGustavo Padovan 	    (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) {
2575d25e28abSJohan Hedberg 		type = HCI_LK_COMBINATION;
2576655fe6ecSJohan Hedberg 		if (conn)
2577655fe6ecSJohan Hedberg 			conn->key_type = type;
2578655fe6ecSJohan Hedberg 	}
2579d25e28abSJohan Hedberg 
258055ed8ca1SJohan Hedberg 	bacpy(&key->bdaddr, bdaddr);
25819b3b4460SAndrei Emeltchenko 	memcpy(key->val, val, HCI_LINK_KEY_SIZE);
258255ed8ca1SJohan Hedberg 	key->pin_len = pin_len;
258355ed8ca1SJohan Hedberg 
2584b6020ba0SWaldemar Rymarkiewicz 	if (type == HCI_LK_CHANGED_COMBINATION)
258555ed8ca1SJohan Hedberg 		key->type = old_key_type;
25864748fed2SJohan Hedberg 	else
25874748fed2SJohan Hedberg 		key->type = type;
25884748fed2SJohan Hedberg 
25897652ff6aSJohan Hedberg 	if (persistent)
25907652ff6aSJohan Hedberg 		*persistent = hci_persistent_key(hdev, conn, type,
25917652ff6aSJohan Hedberg 						 old_key_type);
25924df378a1SJohan Hedberg 
2593567fa2aaSJohan Hedberg 	return key;
259455ed8ca1SJohan Hedberg }
259555ed8ca1SJohan Hedberg 
2596ca9142b8SJohan Hedberg struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
259735d70271SJohan Hedberg 			    u8 addr_type, u8 type, u8 authenticated,
2598fe39c7b2SMarcel Holtmann 			    u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand)
259975d262c2SVinicius Costa Gomes {
2600c9839a11SVinicius Costa Gomes 	struct smp_ltk *key, *old_key;
2601e804d25dSJohan Hedberg 	u8 role = ltk_role(type);
260275d262c2SVinicius Costa Gomes 
2603f3a73d97SJohan Hedberg 	old_key = hci_find_ltk(hdev, bdaddr, addr_type, role);
2604c9839a11SVinicius Costa Gomes 	if (old_key)
260575d262c2SVinicius Costa Gomes 		key = old_key;
2606c9839a11SVinicius Costa Gomes 	else {
26070a14ab41SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_KERNEL);
260875d262c2SVinicius Costa Gomes 		if (!key)
2609ca9142b8SJohan Hedberg 			return NULL;
2610970d0f1bSJohan Hedberg 		list_add_rcu(&key->list, &hdev->long_term_keys);
261175d262c2SVinicius Costa Gomes 	}
261275d262c2SVinicius Costa Gomes 
261375d262c2SVinicius Costa Gomes 	bacpy(&key->bdaddr, bdaddr);
2614c9839a11SVinicius Costa Gomes 	key->bdaddr_type = addr_type;
2615c9839a11SVinicius Costa Gomes 	memcpy(key->val, tk, sizeof(key->val));
2616c9839a11SVinicius Costa Gomes 	key->authenticated = authenticated;
2617c9839a11SVinicius Costa Gomes 	key->ediv = ediv;
2618fe39c7b2SMarcel Holtmann 	key->rand = rand;
2619c9839a11SVinicius Costa Gomes 	key->enc_size = enc_size;
2620c9839a11SVinicius Costa Gomes 	key->type = type;
262175d262c2SVinicius Costa Gomes 
2622ca9142b8SJohan Hedberg 	return key;
262375d262c2SVinicius Costa Gomes }
262475d262c2SVinicius Costa Gomes 
2625ca9142b8SJohan Hedberg struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
2626ca9142b8SJohan Hedberg 			    u8 addr_type, u8 val[16], bdaddr_t *rpa)
2627970c4e46SJohan Hedberg {
2628970c4e46SJohan Hedberg 	struct smp_irk *irk;
2629970c4e46SJohan Hedberg 
2630970c4e46SJohan Hedberg 	irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type);
2631970c4e46SJohan Hedberg 	if (!irk) {
2632970c4e46SJohan Hedberg 		irk = kzalloc(sizeof(*irk), GFP_KERNEL);
2633970c4e46SJohan Hedberg 		if (!irk)
2634ca9142b8SJohan Hedberg 			return NULL;
2635970c4e46SJohan Hedberg 
2636970c4e46SJohan Hedberg 		bacpy(&irk->bdaddr, bdaddr);
2637970c4e46SJohan Hedberg 		irk->addr_type = addr_type;
2638970c4e46SJohan Hedberg 
2639adae20cbSJohan Hedberg 		list_add_rcu(&irk->list, &hdev->identity_resolving_keys);
2640970c4e46SJohan Hedberg 	}
2641970c4e46SJohan Hedberg 
2642970c4e46SJohan Hedberg 	memcpy(irk->val, val, 16);
2643970c4e46SJohan Hedberg 	bacpy(&irk->rpa, rpa);
2644970c4e46SJohan Hedberg 
2645ca9142b8SJohan Hedberg 	return irk;
2646970c4e46SJohan Hedberg }
2647970c4e46SJohan Hedberg 
264855ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
264955ed8ca1SJohan Hedberg {
265055ed8ca1SJohan Hedberg 	struct link_key *key;
265155ed8ca1SJohan Hedberg 
265255ed8ca1SJohan Hedberg 	key = hci_find_link_key(hdev, bdaddr);
265355ed8ca1SJohan Hedberg 	if (!key)
265455ed8ca1SJohan Hedberg 		return -ENOENT;
265555ed8ca1SJohan Hedberg 
26566ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
265755ed8ca1SJohan Hedberg 
26580378b597SJohan Hedberg 	list_del_rcu(&key->list);
26590378b597SJohan Hedberg 	kfree_rcu(key, rcu);
266055ed8ca1SJohan Hedberg 
266155ed8ca1SJohan Hedberg 	return 0;
266255ed8ca1SJohan Hedberg }
266355ed8ca1SJohan Hedberg 
2664e0b2b27eSJohan Hedberg int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
2665b899efafSVinicius Costa Gomes {
2666970d0f1bSJohan Hedberg 	struct smp_ltk *k;
2667c51ffa0bSJohan Hedberg 	int removed = 0;
2668b899efafSVinicius Costa Gomes 
2669970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
2670e0b2b27eSJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type)
2671b899efafSVinicius Costa Gomes 			continue;
2672b899efafSVinicius Costa Gomes 
26736ed93dc6SAndrei Emeltchenko 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
2674b899efafSVinicius Costa Gomes 
2675970d0f1bSJohan Hedberg 		list_del_rcu(&k->list);
2676970d0f1bSJohan Hedberg 		kfree_rcu(k, rcu);
2677c51ffa0bSJohan Hedberg 		removed++;
2678b899efafSVinicius Costa Gomes 	}
2679b899efafSVinicius Costa Gomes 
2680c51ffa0bSJohan Hedberg 	return removed ? 0 : -ENOENT;
2681b899efafSVinicius Costa Gomes }
2682b899efafSVinicius Costa Gomes 
2683a7ec7338SJohan Hedberg void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type)
2684a7ec7338SJohan Hedberg {
2685adae20cbSJohan Hedberg 	struct smp_irk *k;
2686a7ec7338SJohan Hedberg 
2687adae20cbSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) {
2688a7ec7338SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type)
2689a7ec7338SJohan Hedberg 			continue;
2690a7ec7338SJohan Hedberg 
2691a7ec7338SJohan Hedberg 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
2692a7ec7338SJohan Hedberg 
2693adae20cbSJohan Hedberg 		list_del_rcu(&k->list);
2694adae20cbSJohan Hedberg 		kfree_rcu(k, rcu);
2695a7ec7338SJohan Hedberg 	}
2696a7ec7338SJohan Hedberg }
2697a7ec7338SJohan Hedberg 
269855e76b38SJohan Hedberg bool hci_bdaddr_is_paired(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
269955e76b38SJohan Hedberg {
270055e76b38SJohan Hedberg 	struct smp_ltk *k;
27014ba9faf3SJohan Hedberg 	struct smp_irk *irk;
270255e76b38SJohan Hedberg 	u8 addr_type;
270355e76b38SJohan Hedberg 
270455e76b38SJohan Hedberg 	if (type == BDADDR_BREDR) {
270555e76b38SJohan Hedberg 		if (hci_find_link_key(hdev, bdaddr))
270655e76b38SJohan Hedberg 			return true;
270755e76b38SJohan Hedberg 		return false;
270855e76b38SJohan Hedberg 	}
270955e76b38SJohan Hedberg 
271055e76b38SJohan Hedberg 	/* Convert to HCI addr type which struct smp_ltk uses */
271155e76b38SJohan Hedberg 	if (type == BDADDR_LE_PUBLIC)
271255e76b38SJohan Hedberg 		addr_type = ADDR_LE_DEV_PUBLIC;
271355e76b38SJohan Hedberg 	else
271455e76b38SJohan Hedberg 		addr_type = ADDR_LE_DEV_RANDOM;
271555e76b38SJohan Hedberg 
27164ba9faf3SJohan Hedberg 	irk = hci_get_irk(hdev, bdaddr, addr_type);
27174ba9faf3SJohan Hedberg 	if (irk) {
27184ba9faf3SJohan Hedberg 		bdaddr = &irk->bdaddr;
27194ba9faf3SJohan Hedberg 		addr_type = irk->addr_type;
27204ba9faf3SJohan Hedberg 	}
27214ba9faf3SJohan Hedberg 
272255e76b38SJohan Hedberg 	rcu_read_lock();
272355e76b38SJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
272487c8b28dSJohan Hedberg 		if (k->bdaddr_type == addr_type && !bacmp(bdaddr, &k->bdaddr)) {
272587c8b28dSJohan Hedberg 			rcu_read_unlock();
272655e76b38SJohan Hedberg 			return true;
272755e76b38SJohan Hedberg 		}
272887c8b28dSJohan Hedberg 	}
272955e76b38SJohan Hedberg 	rcu_read_unlock();
273055e76b38SJohan Hedberg 
273155e76b38SJohan Hedberg 	return false;
273255e76b38SJohan Hedberg }
273355e76b38SJohan Hedberg 
27346bd32326SVille Tervo /* HCI command timer function */
273565cc2b49SMarcel Holtmann static void hci_cmd_timeout(struct work_struct *work)
27366bd32326SVille Tervo {
273765cc2b49SMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev,
273865cc2b49SMarcel Holtmann 					    cmd_timer.work);
27396bd32326SVille Tervo 
2740bda4f23aSAndrei Emeltchenko 	if (hdev->sent_cmd) {
2741bda4f23aSAndrei Emeltchenko 		struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data;
2742bda4f23aSAndrei Emeltchenko 		u16 opcode = __le16_to_cpu(sent->opcode);
2743bda4f23aSAndrei Emeltchenko 
27442064ee33SMarcel Holtmann 		bt_dev_err(hdev, "command 0x%4.4x tx timeout", opcode);
2745bda4f23aSAndrei Emeltchenko 	} else {
27462064ee33SMarcel Holtmann 		bt_dev_err(hdev, "command tx timeout");
2747bda4f23aSAndrei Emeltchenko 	}
2748bda4f23aSAndrei Emeltchenko 
2749e2bef384SRajat Jain 	if (hdev->cmd_timeout)
2750e2bef384SRajat Jain 		hdev->cmd_timeout(hdev);
2751e2bef384SRajat Jain 
27526bd32326SVille Tervo 	atomic_set(&hdev->cmd_cnt, 1);
2753c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
27546bd32326SVille Tervo }
27556bd32326SVille Tervo 
27562763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
27576928a924SJohan Hedberg 					  bdaddr_t *bdaddr, u8 bdaddr_type)
27582763eda6SSzymon Janc {
27592763eda6SSzymon Janc 	struct oob_data *data;
27602763eda6SSzymon Janc 
27616928a924SJohan Hedberg 	list_for_each_entry(data, &hdev->remote_oob_data, list) {
27626928a924SJohan Hedberg 		if (bacmp(bdaddr, &data->bdaddr) != 0)
27636928a924SJohan Hedberg 			continue;
27646928a924SJohan Hedberg 		if (data->bdaddr_type != bdaddr_type)
27656928a924SJohan Hedberg 			continue;
27662763eda6SSzymon Janc 		return data;
27676928a924SJohan Hedberg 	}
27682763eda6SSzymon Janc 
27692763eda6SSzymon Janc 	return NULL;
27702763eda6SSzymon Janc }
27712763eda6SSzymon Janc 
27726928a924SJohan Hedberg int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
27736928a924SJohan Hedberg 			       u8 bdaddr_type)
27742763eda6SSzymon Janc {
27752763eda6SSzymon Janc 	struct oob_data *data;
27762763eda6SSzymon Janc 
27776928a924SJohan Hedberg 	data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type);
27782763eda6SSzymon Janc 	if (!data)
27792763eda6SSzymon Janc 		return -ENOENT;
27802763eda6SSzymon Janc 
27816928a924SJohan Hedberg 	BT_DBG("%s removing %pMR (%u)", hdev->name, bdaddr, bdaddr_type);
27822763eda6SSzymon Janc 
27832763eda6SSzymon Janc 	list_del(&data->list);
27842763eda6SSzymon Janc 	kfree(data);
27852763eda6SSzymon Janc 
27862763eda6SSzymon Janc 	return 0;
27872763eda6SSzymon Janc }
27882763eda6SSzymon Janc 
278935f7498aSJohan Hedberg void hci_remote_oob_data_clear(struct hci_dev *hdev)
27902763eda6SSzymon Janc {
27912763eda6SSzymon Janc 	struct oob_data *data, *n;
27922763eda6SSzymon Janc 
27932763eda6SSzymon Janc 	list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) {
27942763eda6SSzymon Janc 		list_del(&data->list);
27952763eda6SSzymon Janc 		kfree(data);
27962763eda6SSzymon Janc 	}
27972763eda6SSzymon Janc }
27982763eda6SSzymon Janc 
27990798872eSMarcel Holtmann int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
28006928a924SJohan Hedberg 			    u8 bdaddr_type, u8 *hash192, u8 *rand192,
280138da1703SJohan Hedberg 			    u8 *hash256, u8 *rand256)
28020798872eSMarcel Holtmann {
28030798872eSMarcel Holtmann 	struct oob_data *data;
28040798872eSMarcel Holtmann 
28056928a924SJohan Hedberg 	data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type);
28060798872eSMarcel Holtmann 	if (!data) {
28070a14ab41SJohan Hedberg 		data = kmalloc(sizeof(*data), GFP_KERNEL);
28080798872eSMarcel Holtmann 		if (!data)
28090798872eSMarcel Holtmann 			return -ENOMEM;
28100798872eSMarcel Holtmann 
28110798872eSMarcel Holtmann 		bacpy(&data->bdaddr, bdaddr);
28126928a924SJohan Hedberg 		data->bdaddr_type = bdaddr_type;
28130798872eSMarcel Holtmann 		list_add(&data->list, &hdev->remote_oob_data);
28140798872eSMarcel Holtmann 	}
28150798872eSMarcel Holtmann 
281681328d5cSJohan Hedberg 	if (hash192 && rand192) {
28170798872eSMarcel Holtmann 		memcpy(data->hash192, hash192, sizeof(data->hash192));
281838da1703SJohan Hedberg 		memcpy(data->rand192, rand192, sizeof(data->rand192));
2819f7697b16SMarcel Holtmann 		if (hash256 && rand256)
2820f7697b16SMarcel Holtmann 			data->present = 0x03;
282181328d5cSJohan Hedberg 	} else {
282281328d5cSJohan Hedberg 		memset(data->hash192, 0, sizeof(data->hash192));
282381328d5cSJohan Hedberg 		memset(data->rand192, 0, sizeof(data->rand192));
2824f7697b16SMarcel Holtmann 		if (hash256 && rand256)
2825f7697b16SMarcel Holtmann 			data->present = 0x02;
2826f7697b16SMarcel Holtmann 		else
2827f7697b16SMarcel Holtmann 			data->present = 0x00;
282881328d5cSJohan Hedberg 	}
28290798872eSMarcel Holtmann 
283081328d5cSJohan Hedberg 	if (hash256 && rand256) {
28310798872eSMarcel Holtmann 		memcpy(data->hash256, hash256, sizeof(data->hash256));
283238da1703SJohan Hedberg 		memcpy(data->rand256, rand256, sizeof(data->rand256));
283381328d5cSJohan Hedberg 	} else {
283481328d5cSJohan Hedberg 		memset(data->hash256, 0, sizeof(data->hash256));
283581328d5cSJohan Hedberg 		memset(data->rand256, 0, sizeof(data->rand256));
2836f7697b16SMarcel Holtmann 		if (hash192 && rand192)
2837f7697b16SMarcel Holtmann 			data->present = 0x01;
283881328d5cSJohan Hedberg 	}
28390798872eSMarcel Holtmann 
28406ed93dc6SAndrei Emeltchenko 	BT_DBG("%s for %pMR", hdev->name, bdaddr);
28412763eda6SSzymon Janc 
28422763eda6SSzymon Janc 	return 0;
28432763eda6SSzymon Janc }
28442763eda6SSzymon Janc 
2845d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */
2846d2609b34SFlorian Grandel struct adv_info *hci_find_adv_instance(struct hci_dev *hdev, u8 instance)
2847d2609b34SFlorian Grandel {
2848d2609b34SFlorian Grandel 	struct adv_info *adv_instance;
2849d2609b34SFlorian Grandel 
2850d2609b34SFlorian Grandel 	list_for_each_entry(adv_instance, &hdev->adv_instances, list) {
2851d2609b34SFlorian Grandel 		if (adv_instance->instance == instance)
2852d2609b34SFlorian Grandel 			return adv_instance;
2853d2609b34SFlorian Grandel 	}
2854d2609b34SFlorian Grandel 
2855d2609b34SFlorian Grandel 	return NULL;
2856d2609b34SFlorian Grandel }
2857d2609b34SFlorian Grandel 
2858d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */
285974b93e9fSPrasanna Karthik struct adv_info *hci_get_next_instance(struct hci_dev *hdev, u8 instance)
286074b93e9fSPrasanna Karthik {
2861d2609b34SFlorian Grandel 	struct adv_info *cur_instance;
2862d2609b34SFlorian Grandel 
2863d2609b34SFlorian Grandel 	cur_instance = hci_find_adv_instance(hdev, instance);
2864d2609b34SFlorian Grandel 	if (!cur_instance)
2865d2609b34SFlorian Grandel 		return NULL;
2866d2609b34SFlorian Grandel 
2867d2609b34SFlorian Grandel 	if (cur_instance == list_last_entry(&hdev->adv_instances,
2868d2609b34SFlorian Grandel 					    struct adv_info, list))
2869d2609b34SFlorian Grandel 		return list_first_entry(&hdev->adv_instances,
2870d2609b34SFlorian Grandel 						 struct adv_info, list);
2871d2609b34SFlorian Grandel 	else
2872d2609b34SFlorian Grandel 		return list_next_entry(cur_instance, list);
2873d2609b34SFlorian Grandel }
2874d2609b34SFlorian Grandel 
2875d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */
2876d2609b34SFlorian Grandel int hci_remove_adv_instance(struct hci_dev *hdev, u8 instance)
2877d2609b34SFlorian Grandel {
2878d2609b34SFlorian Grandel 	struct adv_info *adv_instance;
2879d2609b34SFlorian Grandel 
2880d2609b34SFlorian Grandel 	adv_instance = hci_find_adv_instance(hdev, instance);
2881d2609b34SFlorian Grandel 	if (!adv_instance)
2882d2609b34SFlorian Grandel 		return -ENOENT;
2883d2609b34SFlorian Grandel 
2884d2609b34SFlorian Grandel 	BT_DBG("%s removing %dMR", hdev->name, instance);
2885d2609b34SFlorian Grandel 
2886cab054abSJohan Hedberg 	if (hdev->cur_adv_instance == instance) {
2887cab054abSJohan Hedberg 		if (hdev->adv_instance_timeout) {
28885d900e46SFlorian Grandel 			cancel_delayed_work(&hdev->adv_instance_expire);
28895d900e46SFlorian Grandel 			hdev->adv_instance_timeout = 0;
28905d900e46SFlorian Grandel 		}
2891cab054abSJohan Hedberg 		hdev->cur_adv_instance = 0x00;
2892cab054abSJohan Hedberg 	}
28935d900e46SFlorian Grandel 
2894a73c046aSJaganath Kanakkassery 	cancel_delayed_work_sync(&adv_instance->rpa_expired_cb);
2895a73c046aSJaganath Kanakkassery 
2896d2609b34SFlorian Grandel 	list_del(&adv_instance->list);
2897d2609b34SFlorian Grandel 	kfree(adv_instance);
2898d2609b34SFlorian Grandel 
2899d2609b34SFlorian Grandel 	hdev->adv_instance_cnt--;
2900d2609b34SFlorian Grandel 
2901d2609b34SFlorian Grandel 	return 0;
2902d2609b34SFlorian Grandel }
2903d2609b34SFlorian Grandel 
2904a73c046aSJaganath Kanakkassery void hci_adv_instances_set_rpa_expired(struct hci_dev *hdev, bool rpa_expired)
2905a73c046aSJaganath Kanakkassery {
2906a73c046aSJaganath Kanakkassery 	struct adv_info *adv_instance, *n;
2907a73c046aSJaganath Kanakkassery 
2908a73c046aSJaganath Kanakkassery 	list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list)
2909a73c046aSJaganath Kanakkassery 		adv_instance->rpa_expired = rpa_expired;
2910a73c046aSJaganath Kanakkassery }
2911a73c046aSJaganath Kanakkassery 
2912d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */
2913d2609b34SFlorian Grandel void hci_adv_instances_clear(struct hci_dev *hdev)
2914d2609b34SFlorian Grandel {
2915d2609b34SFlorian Grandel 	struct adv_info *adv_instance, *n;
2916d2609b34SFlorian Grandel 
29175d900e46SFlorian Grandel 	if (hdev->adv_instance_timeout) {
29185d900e46SFlorian Grandel 		cancel_delayed_work(&hdev->adv_instance_expire);
29195d900e46SFlorian Grandel 		hdev->adv_instance_timeout = 0;
29205d900e46SFlorian Grandel 	}
29215d900e46SFlorian Grandel 
2922d2609b34SFlorian Grandel 	list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) {
2923a73c046aSJaganath Kanakkassery 		cancel_delayed_work_sync(&adv_instance->rpa_expired_cb);
2924d2609b34SFlorian Grandel 		list_del(&adv_instance->list);
2925d2609b34SFlorian Grandel 		kfree(adv_instance);
2926d2609b34SFlorian Grandel 	}
2927d2609b34SFlorian Grandel 
2928d2609b34SFlorian Grandel 	hdev->adv_instance_cnt = 0;
2929cab054abSJohan Hedberg 	hdev->cur_adv_instance = 0x00;
2930d2609b34SFlorian Grandel }
2931d2609b34SFlorian Grandel 
2932a73c046aSJaganath Kanakkassery static void adv_instance_rpa_expired(struct work_struct *work)
2933a73c046aSJaganath Kanakkassery {
2934a73c046aSJaganath Kanakkassery 	struct adv_info *adv_instance = container_of(work, struct adv_info,
2935a73c046aSJaganath Kanakkassery 						     rpa_expired_cb.work);
2936a73c046aSJaganath Kanakkassery 
2937a73c046aSJaganath Kanakkassery 	BT_DBG("");
2938a73c046aSJaganath Kanakkassery 
2939a73c046aSJaganath Kanakkassery 	adv_instance->rpa_expired = true;
2940a73c046aSJaganath Kanakkassery }
2941a73c046aSJaganath Kanakkassery 
2942d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */
2943d2609b34SFlorian Grandel int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags,
2944d2609b34SFlorian Grandel 			 u16 adv_data_len, u8 *adv_data,
2945d2609b34SFlorian Grandel 			 u16 scan_rsp_len, u8 *scan_rsp_data,
2946d2609b34SFlorian Grandel 			 u16 timeout, u16 duration)
2947d2609b34SFlorian Grandel {
2948d2609b34SFlorian Grandel 	struct adv_info *adv_instance;
2949d2609b34SFlorian Grandel 
2950d2609b34SFlorian Grandel 	adv_instance = hci_find_adv_instance(hdev, instance);
2951d2609b34SFlorian Grandel 	if (adv_instance) {
2952d2609b34SFlorian Grandel 		memset(adv_instance->adv_data, 0,
2953d2609b34SFlorian Grandel 		       sizeof(adv_instance->adv_data));
2954d2609b34SFlorian Grandel 		memset(adv_instance->scan_rsp_data, 0,
2955d2609b34SFlorian Grandel 		       sizeof(adv_instance->scan_rsp_data));
2956d2609b34SFlorian Grandel 	} else {
29571d0fac2cSLuiz Augusto von Dentz 		if (hdev->adv_instance_cnt >= hdev->le_num_of_adv_sets ||
2958d2609b34SFlorian Grandel 		    instance < 1 || instance > HCI_MAX_ADV_INSTANCES)
2959d2609b34SFlorian Grandel 			return -EOVERFLOW;
2960d2609b34SFlorian Grandel 
296139ecfad6SJohan Hedberg 		adv_instance = kzalloc(sizeof(*adv_instance), GFP_KERNEL);
2962d2609b34SFlorian Grandel 		if (!adv_instance)
2963d2609b34SFlorian Grandel 			return -ENOMEM;
2964d2609b34SFlorian Grandel 
2965fffd38bcSFlorian Grandel 		adv_instance->pending = true;
2966d2609b34SFlorian Grandel 		adv_instance->instance = instance;
2967d2609b34SFlorian Grandel 		list_add(&adv_instance->list, &hdev->adv_instances);
2968d2609b34SFlorian Grandel 		hdev->adv_instance_cnt++;
2969d2609b34SFlorian Grandel 	}
2970d2609b34SFlorian Grandel 
2971d2609b34SFlorian Grandel 	adv_instance->flags = flags;
2972d2609b34SFlorian Grandel 	adv_instance->adv_data_len = adv_data_len;
2973d2609b34SFlorian Grandel 	adv_instance->scan_rsp_len = scan_rsp_len;
2974d2609b34SFlorian Grandel 
2975d2609b34SFlorian Grandel 	if (adv_data_len)
2976d2609b34SFlorian Grandel 		memcpy(adv_instance->adv_data, adv_data, adv_data_len);
2977d2609b34SFlorian Grandel 
2978d2609b34SFlorian Grandel 	if (scan_rsp_len)
2979d2609b34SFlorian Grandel 		memcpy(adv_instance->scan_rsp_data,
2980d2609b34SFlorian Grandel 		       scan_rsp_data, scan_rsp_len);
2981d2609b34SFlorian Grandel 
2982d2609b34SFlorian Grandel 	adv_instance->timeout = timeout;
29835d900e46SFlorian Grandel 	adv_instance->remaining_time = timeout;
2984d2609b34SFlorian Grandel 
2985d2609b34SFlorian Grandel 	if (duration == 0)
298610873f99SAlain Michaud 		adv_instance->duration = hdev->def_multi_adv_rotation_duration;
2987d2609b34SFlorian Grandel 	else
2988d2609b34SFlorian Grandel 		adv_instance->duration = duration;
2989d2609b34SFlorian Grandel 
2990de181e88SJaganath Kanakkassery 	adv_instance->tx_power = HCI_TX_POWER_INVALID;
2991de181e88SJaganath Kanakkassery 
2992a73c046aSJaganath Kanakkassery 	INIT_DELAYED_WORK(&adv_instance->rpa_expired_cb,
2993a73c046aSJaganath Kanakkassery 			  adv_instance_rpa_expired);
2994a73c046aSJaganath Kanakkassery 
2995d2609b34SFlorian Grandel 	BT_DBG("%s for %dMR", hdev->name, instance);
2996d2609b34SFlorian Grandel 
2997d2609b34SFlorian Grandel 	return 0;
2998d2609b34SFlorian Grandel }
2999d2609b34SFlorian Grandel 
3000e5e1e7fdSMiao-chen Chou /* This function requires the caller holds hdev->lock */
3001e5e1e7fdSMiao-chen Chou void hci_adv_monitors_clear(struct hci_dev *hdev)
3002e5e1e7fdSMiao-chen Chou {
3003b139553dSMiao-chen Chou 	struct adv_monitor *monitor;
3004b139553dSMiao-chen Chou 	int handle;
3005b139553dSMiao-chen Chou 
3006b139553dSMiao-chen Chou 	idr_for_each_entry(&hdev->adv_monitors_idr, monitor, handle)
3007b139553dSMiao-chen Chou 		hci_free_adv_monitor(monitor);
3008b139553dSMiao-chen Chou 
3009e5e1e7fdSMiao-chen Chou 	idr_destroy(&hdev->adv_monitors_idr);
3010e5e1e7fdSMiao-chen Chou }
3011e5e1e7fdSMiao-chen Chou 
3012b139553dSMiao-chen Chou void hci_free_adv_monitor(struct adv_monitor *monitor)
3013b139553dSMiao-chen Chou {
3014b139553dSMiao-chen Chou 	struct adv_pattern *pattern;
3015b139553dSMiao-chen Chou 	struct adv_pattern *tmp;
3016b139553dSMiao-chen Chou 
3017b139553dSMiao-chen Chou 	if (!monitor)
3018b139553dSMiao-chen Chou 		return;
3019b139553dSMiao-chen Chou 
3020b139553dSMiao-chen Chou 	list_for_each_entry_safe(pattern, tmp, &monitor->patterns, list)
3021b139553dSMiao-chen Chou 		kfree(pattern);
3022b139553dSMiao-chen Chou 
3023b139553dSMiao-chen Chou 	kfree(monitor);
3024b139553dSMiao-chen Chou }
3025b139553dSMiao-chen Chou 
3026b139553dSMiao-chen Chou /* This function requires the caller holds hdev->lock */
3027b139553dSMiao-chen Chou int hci_add_adv_monitor(struct hci_dev *hdev, struct adv_monitor *monitor)
3028b139553dSMiao-chen Chou {
3029b139553dSMiao-chen Chou 	int min, max, handle;
3030b139553dSMiao-chen Chou 
3031b139553dSMiao-chen Chou 	if (!monitor)
3032b139553dSMiao-chen Chou 		return -EINVAL;
3033b139553dSMiao-chen Chou 
3034b139553dSMiao-chen Chou 	min = HCI_MIN_ADV_MONITOR_HANDLE;
3035b139553dSMiao-chen Chou 	max = HCI_MIN_ADV_MONITOR_HANDLE + HCI_MAX_ADV_MONITOR_NUM_HANDLES;
3036b139553dSMiao-chen Chou 	handle = idr_alloc(&hdev->adv_monitors_idr, monitor, min, max,
3037b139553dSMiao-chen Chou 			   GFP_KERNEL);
3038b139553dSMiao-chen Chou 	if (handle < 0)
3039b139553dSMiao-chen Chou 		return handle;
3040b139553dSMiao-chen Chou 
3041b139553dSMiao-chen Chou 	hdev->adv_monitors_cnt++;
3042b139553dSMiao-chen Chou 	monitor->handle = handle;
30438208f5a9SMiao-chen Chou 
30448208f5a9SMiao-chen Chou 	hci_update_background_scan(hdev);
30458208f5a9SMiao-chen Chou 
3046b139553dSMiao-chen Chou 	return 0;
3047b139553dSMiao-chen Chou }
3048b139553dSMiao-chen Chou 
3049bd2fbc6cSMiao-chen Chou static int free_adv_monitor(int id, void *ptr, void *data)
3050bd2fbc6cSMiao-chen Chou {
3051bd2fbc6cSMiao-chen Chou 	struct hci_dev *hdev = data;
3052bd2fbc6cSMiao-chen Chou 	struct adv_monitor *monitor = ptr;
3053bd2fbc6cSMiao-chen Chou 
3054bd2fbc6cSMiao-chen Chou 	idr_remove(&hdev->adv_monitors_idr, monitor->handle);
3055bd2fbc6cSMiao-chen Chou 	hci_free_adv_monitor(monitor);
3056bd2fbc6cSMiao-chen Chou 
3057bd2fbc6cSMiao-chen Chou 	return 0;
3058bd2fbc6cSMiao-chen Chou }
3059bd2fbc6cSMiao-chen Chou 
3060bd2fbc6cSMiao-chen Chou /* This function requires the caller holds hdev->lock */
3061bd2fbc6cSMiao-chen Chou int hci_remove_adv_monitor(struct hci_dev *hdev, u16 handle)
3062bd2fbc6cSMiao-chen Chou {
3063bd2fbc6cSMiao-chen Chou 	struct adv_monitor *monitor;
3064bd2fbc6cSMiao-chen Chou 
3065bd2fbc6cSMiao-chen Chou 	if (handle) {
3066bd2fbc6cSMiao-chen Chou 		monitor = idr_find(&hdev->adv_monitors_idr, handle);
3067bd2fbc6cSMiao-chen Chou 		if (!monitor)
3068bd2fbc6cSMiao-chen Chou 			return -ENOENT;
3069bd2fbc6cSMiao-chen Chou 
3070bd2fbc6cSMiao-chen Chou 		idr_remove(&hdev->adv_monitors_idr, monitor->handle);
3071bd2fbc6cSMiao-chen Chou 		hci_free_adv_monitor(monitor);
3072bd2fbc6cSMiao-chen Chou 	} else {
3073bd2fbc6cSMiao-chen Chou 		/* Remove all monitors if handle is 0. */
3074bd2fbc6cSMiao-chen Chou 		idr_for_each(&hdev->adv_monitors_idr, &free_adv_monitor, hdev);
3075bd2fbc6cSMiao-chen Chou 	}
3076bd2fbc6cSMiao-chen Chou 
30778208f5a9SMiao-chen Chou 	hci_update_background_scan(hdev);
30788208f5a9SMiao-chen Chou 
3079bd2fbc6cSMiao-chen Chou 	return 0;
3080bd2fbc6cSMiao-chen Chou }
3081bd2fbc6cSMiao-chen Chou 
30828208f5a9SMiao-chen Chou /* This function requires the caller holds hdev->lock */
30838208f5a9SMiao-chen Chou bool hci_is_adv_monitoring(struct hci_dev *hdev)
30848208f5a9SMiao-chen Chou {
30858208f5a9SMiao-chen Chou 	return !idr_is_empty(&hdev->adv_monitors_idr);
30868208f5a9SMiao-chen Chou }
30878208f5a9SMiao-chen Chou 
3088dcc36c16SJohan Hedberg struct bdaddr_list *hci_bdaddr_list_lookup(struct list_head *bdaddr_list,
3089b9ee0a78SMarcel Holtmann 					 bdaddr_t *bdaddr, u8 type)
3090b2a66aadSAntti Julku {
3091b2a66aadSAntti Julku 	struct bdaddr_list *b;
3092b2a66aadSAntti Julku 
3093dcc36c16SJohan Hedberg 	list_for_each_entry(b, bdaddr_list, list) {
3094b9ee0a78SMarcel Holtmann 		if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
3095b2a66aadSAntti Julku 			return b;
3096b9ee0a78SMarcel Holtmann 	}
3097b2a66aadSAntti Julku 
3098b2a66aadSAntti Julku 	return NULL;
3099b2a66aadSAntti Julku }
3100b2a66aadSAntti Julku 
3101b950aa88SAnkit Navik struct bdaddr_list_with_irk *hci_bdaddr_list_lookup_with_irk(
3102b950aa88SAnkit Navik 				struct list_head *bdaddr_list, bdaddr_t *bdaddr,
3103b950aa88SAnkit Navik 				u8 type)
3104b950aa88SAnkit Navik {
3105b950aa88SAnkit Navik 	struct bdaddr_list_with_irk *b;
3106b950aa88SAnkit Navik 
3107b950aa88SAnkit Navik 	list_for_each_entry(b, bdaddr_list, list) {
3108b950aa88SAnkit Navik 		if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
3109b950aa88SAnkit Navik 			return b;
3110b950aa88SAnkit Navik 	}
3111b950aa88SAnkit Navik 
3112b950aa88SAnkit Navik 	return NULL;
3113b950aa88SAnkit Navik }
3114b950aa88SAnkit Navik 
31158baaa403SAbhishek Pandit-Subedi struct bdaddr_list_with_flags *
31168baaa403SAbhishek Pandit-Subedi hci_bdaddr_list_lookup_with_flags(struct list_head *bdaddr_list,
31178baaa403SAbhishek Pandit-Subedi 				  bdaddr_t *bdaddr, u8 type)
31188baaa403SAbhishek Pandit-Subedi {
31198baaa403SAbhishek Pandit-Subedi 	struct bdaddr_list_with_flags *b;
31208baaa403SAbhishek Pandit-Subedi 
31218baaa403SAbhishek Pandit-Subedi 	list_for_each_entry(b, bdaddr_list, list) {
31228baaa403SAbhishek Pandit-Subedi 		if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
31238baaa403SAbhishek Pandit-Subedi 			return b;
31248baaa403SAbhishek Pandit-Subedi 	}
31258baaa403SAbhishek Pandit-Subedi 
31268baaa403SAbhishek Pandit-Subedi 	return NULL;
31278baaa403SAbhishek Pandit-Subedi }
31288baaa403SAbhishek Pandit-Subedi 
3129dcc36c16SJohan Hedberg void hci_bdaddr_list_clear(struct list_head *bdaddr_list)
3130b2a66aadSAntti Julku {
31317eb7404fSGeliang Tang 	struct bdaddr_list *b, *n;
3132b2a66aadSAntti Julku 
31337eb7404fSGeliang Tang 	list_for_each_entry_safe(b, n, bdaddr_list, list) {
31347eb7404fSGeliang Tang 		list_del(&b->list);
3135b2a66aadSAntti Julku 		kfree(b);
3136b2a66aadSAntti Julku 	}
3137b2a66aadSAntti Julku }
3138b2a66aadSAntti Julku 
3139dcc36c16SJohan Hedberg int hci_bdaddr_list_add(struct list_head *list, bdaddr_t *bdaddr, u8 type)
3140b2a66aadSAntti Julku {
3141b2a66aadSAntti Julku 	struct bdaddr_list *entry;
3142b2a66aadSAntti Julku 
3143b9ee0a78SMarcel Holtmann 	if (!bacmp(bdaddr, BDADDR_ANY))
3144b2a66aadSAntti Julku 		return -EBADF;
3145b2a66aadSAntti Julku 
3146dcc36c16SJohan Hedberg 	if (hci_bdaddr_list_lookup(list, bdaddr, type))
31475e762444SAntti Julku 		return -EEXIST;
3148b2a66aadSAntti Julku 
314927f70f3eSJohan Hedberg 	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
31505e762444SAntti Julku 	if (!entry)
31515e762444SAntti Julku 		return -ENOMEM;
3152b2a66aadSAntti Julku 
3153b2a66aadSAntti Julku 	bacpy(&entry->bdaddr, bdaddr);
3154b9ee0a78SMarcel Holtmann 	entry->bdaddr_type = type;
3155b2a66aadSAntti Julku 
3156dcc36c16SJohan Hedberg 	list_add(&entry->list, list);
3157b2a66aadSAntti Julku 
31582a8357f2SJohan Hedberg 	return 0;
3159b2a66aadSAntti Julku }
3160b2a66aadSAntti Julku 
3161b950aa88SAnkit Navik int hci_bdaddr_list_add_with_irk(struct list_head *list, bdaddr_t *bdaddr,
3162b950aa88SAnkit Navik 					u8 type, u8 *peer_irk, u8 *local_irk)
3163b950aa88SAnkit Navik {
3164b950aa88SAnkit Navik 	struct bdaddr_list_with_irk *entry;
3165b950aa88SAnkit Navik 
3166b950aa88SAnkit Navik 	if (!bacmp(bdaddr, BDADDR_ANY))
3167b950aa88SAnkit Navik 		return -EBADF;
3168b950aa88SAnkit Navik 
3169b950aa88SAnkit Navik 	if (hci_bdaddr_list_lookup(list, bdaddr, type))
3170b950aa88SAnkit Navik 		return -EEXIST;
3171b950aa88SAnkit Navik 
3172b950aa88SAnkit Navik 	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
3173b950aa88SAnkit Navik 	if (!entry)
3174b950aa88SAnkit Navik 		return -ENOMEM;
3175b950aa88SAnkit Navik 
3176b950aa88SAnkit Navik 	bacpy(&entry->bdaddr, bdaddr);
3177b950aa88SAnkit Navik 	entry->bdaddr_type = type;
3178b950aa88SAnkit Navik 
3179b950aa88SAnkit Navik 	if (peer_irk)
3180b950aa88SAnkit Navik 		memcpy(entry->peer_irk, peer_irk, 16);
3181b950aa88SAnkit Navik 
3182b950aa88SAnkit Navik 	if (local_irk)
3183b950aa88SAnkit Navik 		memcpy(entry->local_irk, local_irk, 16);
3184b950aa88SAnkit Navik 
3185b950aa88SAnkit Navik 	list_add(&entry->list, list);
3186b950aa88SAnkit Navik 
3187b950aa88SAnkit Navik 	return 0;
3188b950aa88SAnkit Navik }
3189b950aa88SAnkit Navik 
31908baaa403SAbhishek Pandit-Subedi int hci_bdaddr_list_add_with_flags(struct list_head *list, bdaddr_t *bdaddr,
31918baaa403SAbhishek Pandit-Subedi 				   u8 type, u32 flags)
31928baaa403SAbhishek Pandit-Subedi {
31938baaa403SAbhishek Pandit-Subedi 	struct bdaddr_list_with_flags *entry;
31948baaa403SAbhishek Pandit-Subedi 
31958baaa403SAbhishek Pandit-Subedi 	if (!bacmp(bdaddr, BDADDR_ANY))
31968baaa403SAbhishek Pandit-Subedi 		return -EBADF;
31978baaa403SAbhishek Pandit-Subedi 
31988baaa403SAbhishek Pandit-Subedi 	if (hci_bdaddr_list_lookup(list, bdaddr, type))
31998baaa403SAbhishek Pandit-Subedi 		return -EEXIST;
32008baaa403SAbhishek Pandit-Subedi 
32018baaa403SAbhishek Pandit-Subedi 	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
32028baaa403SAbhishek Pandit-Subedi 	if (!entry)
32038baaa403SAbhishek Pandit-Subedi 		return -ENOMEM;
32048baaa403SAbhishek Pandit-Subedi 
32058baaa403SAbhishek Pandit-Subedi 	bacpy(&entry->bdaddr, bdaddr);
32068baaa403SAbhishek Pandit-Subedi 	entry->bdaddr_type = type;
32078baaa403SAbhishek Pandit-Subedi 	entry->current_flags = flags;
32088baaa403SAbhishek Pandit-Subedi 
32098baaa403SAbhishek Pandit-Subedi 	list_add(&entry->list, list);
32108baaa403SAbhishek Pandit-Subedi 
32118baaa403SAbhishek Pandit-Subedi 	return 0;
32128baaa403SAbhishek Pandit-Subedi }
32138baaa403SAbhishek Pandit-Subedi 
3214dcc36c16SJohan Hedberg int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, u8 type)
3215b2a66aadSAntti Julku {
3216b2a66aadSAntti Julku 	struct bdaddr_list *entry;
3217b2a66aadSAntti Julku 
321835f7498aSJohan Hedberg 	if (!bacmp(bdaddr, BDADDR_ANY)) {
3219dcc36c16SJohan Hedberg 		hci_bdaddr_list_clear(list);
322035f7498aSJohan Hedberg 		return 0;
322135f7498aSJohan Hedberg 	}
3222b2a66aadSAntti Julku 
3223dcc36c16SJohan Hedberg 	entry = hci_bdaddr_list_lookup(list, bdaddr, type);
3224d2ab0ac1SMarcel Holtmann 	if (!entry)
3225d2ab0ac1SMarcel Holtmann 		return -ENOENT;
3226d2ab0ac1SMarcel Holtmann 
3227d2ab0ac1SMarcel Holtmann 	list_del(&entry->list);
3228d2ab0ac1SMarcel Holtmann 	kfree(entry);
3229d2ab0ac1SMarcel Holtmann 
3230d2ab0ac1SMarcel Holtmann 	return 0;
3231d2ab0ac1SMarcel Holtmann }
3232d2ab0ac1SMarcel Holtmann 
3233b950aa88SAnkit Navik int hci_bdaddr_list_del_with_irk(struct list_head *list, bdaddr_t *bdaddr,
3234b950aa88SAnkit Navik 							u8 type)
3235b950aa88SAnkit Navik {
3236b950aa88SAnkit Navik 	struct bdaddr_list_with_irk *entry;
3237b950aa88SAnkit Navik 
3238b950aa88SAnkit Navik 	if (!bacmp(bdaddr, BDADDR_ANY)) {
3239b950aa88SAnkit Navik 		hci_bdaddr_list_clear(list);
3240b950aa88SAnkit Navik 		return 0;
3241b950aa88SAnkit Navik 	}
3242b950aa88SAnkit Navik 
3243b950aa88SAnkit Navik 	entry = hci_bdaddr_list_lookup_with_irk(list, bdaddr, type);
3244b950aa88SAnkit Navik 	if (!entry)
3245b950aa88SAnkit Navik 		return -ENOENT;
3246b950aa88SAnkit Navik 
3247b950aa88SAnkit Navik 	list_del(&entry->list);
3248b950aa88SAnkit Navik 	kfree(entry);
3249b950aa88SAnkit Navik 
3250b950aa88SAnkit Navik 	return 0;
3251b950aa88SAnkit Navik }
3252b950aa88SAnkit Navik 
32538baaa403SAbhishek Pandit-Subedi int hci_bdaddr_list_del_with_flags(struct list_head *list, bdaddr_t *bdaddr,
32548baaa403SAbhishek Pandit-Subedi 				   u8 type)
32558baaa403SAbhishek Pandit-Subedi {
32568baaa403SAbhishek Pandit-Subedi 	struct bdaddr_list_with_flags *entry;
32578baaa403SAbhishek Pandit-Subedi 
32588baaa403SAbhishek Pandit-Subedi 	if (!bacmp(bdaddr, BDADDR_ANY)) {
32598baaa403SAbhishek Pandit-Subedi 		hci_bdaddr_list_clear(list);
32608baaa403SAbhishek Pandit-Subedi 		return 0;
32618baaa403SAbhishek Pandit-Subedi 	}
32628baaa403SAbhishek Pandit-Subedi 
32638baaa403SAbhishek Pandit-Subedi 	entry = hci_bdaddr_list_lookup_with_flags(list, bdaddr, type);
32648baaa403SAbhishek Pandit-Subedi 	if (!entry)
32658baaa403SAbhishek Pandit-Subedi 		return -ENOENT;
32668baaa403SAbhishek Pandit-Subedi 
32678baaa403SAbhishek Pandit-Subedi 	list_del(&entry->list);
32688baaa403SAbhishek Pandit-Subedi 	kfree(entry);
32698baaa403SAbhishek Pandit-Subedi 
32708baaa403SAbhishek Pandit-Subedi 	return 0;
32718baaa403SAbhishek Pandit-Subedi }
32728baaa403SAbhishek Pandit-Subedi 
327315819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
327415819a70SAndre Guedes struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
327515819a70SAndre Guedes 					       bdaddr_t *addr, u8 addr_type)
327615819a70SAndre Guedes {
327715819a70SAndre Guedes 	struct hci_conn_params *params;
327815819a70SAndre Guedes 
327915819a70SAndre Guedes 	list_for_each_entry(params, &hdev->le_conn_params, list) {
328015819a70SAndre Guedes 		if (bacmp(&params->addr, addr) == 0 &&
328115819a70SAndre Guedes 		    params->addr_type == addr_type) {
328215819a70SAndre Guedes 			return params;
328315819a70SAndre Guedes 		}
328415819a70SAndre Guedes 	}
328515819a70SAndre Guedes 
328615819a70SAndre Guedes 	return NULL;
328715819a70SAndre Guedes }
328815819a70SAndre Guedes 
328915819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
3290501f8827SJohan Hedberg struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
32914b10966fSMarcel Holtmann 						  bdaddr_t *addr, u8 addr_type)
329215819a70SAndre Guedes {
3293912b42efSJohan Hedberg 	struct hci_conn_params *param;
329415819a70SAndre Guedes 
3295501f8827SJohan Hedberg 	list_for_each_entry(param, list, action) {
3296912b42efSJohan Hedberg 		if (bacmp(&param->addr, addr) == 0 &&
3297912b42efSJohan Hedberg 		    param->addr_type == addr_type)
3298912b42efSJohan Hedberg 			return param;
32994b10966fSMarcel Holtmann 	}
33004b10966fSMarcel Holtmann 
33014b10966fSMarcel Holtmann 	return NULL;
330215819a70SAndre Guedes }
330315819a70SAndre Guedes 
330415819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
330551d167c0SMarcel Holtmann struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,
330651d167c0SMarcel Holtmann 					    bdaddr_t *addr, u8 addr_type)
330715819a70SAndre Guedes {
330815819a70SAndre Guedes 	struct hci_conn_params *params;
330915819a70SAndre Guedes 
331015819a70SAndre Guedes 	params = hci_conn_params_lookup(hdev, addr, addr_type);
3311cef952ceSAndre Guedes 	if (params)
331251d167c0SMarcel Holtmann 		return params;
331315819a70SAndre Guedes 
331415819a70SAndre Guedes 	params = kzalloc(sizeof(*params), GFP_KERNEL);
331515819a70SAndre Guedes 	if (!params) {
33162064ee33SMarcel Holtmann 		bt_dev_err(hdev, "out of memory");
331751d167c0SMarcel Holtmann 		return NULL;
331815819a70SAndre Guedes 	}
331915819a70SAndre Guedes 
332015819a70SAndre Guedes 	bacpy(&params->addr, addr);
332115819a70SAndre Guedes 	params->addr_type = addr_type;
3322cef952ceSAndre Guedes 
3323cef952ceSAndre Guedes 	list_add(&params->list, &hdev->le_conn_params);
332493450c75SJohan Hedberg 	INIT_LIST_HEAD(&params->action);
3325cef952ceSAndre Guedes 
3326bf5b3c8bSMarcel Holtmann 	params->conn_min_interval = hdev->le_conn_min_interval;
3327bf5b3c8bSMarcel Holtmann 	params->conn_max_interval = hdev->le_conn_max_interval;
3328bf5b3c8bSMarcel Holtmann 	params->conn_latency = hdev->le_conn_latency;
3329bf5b3c8bSMarcel Holtmann 	params->supervision_timeout = hdev->le_supv_timeout;
3330bf5b3c8bSMarcel Holtmann 	params->auto_connect = HCI_AUTO_CONN_DISABLED;
3331bf5b3c8bSMarcel Holtmann 
3332bf5b3c8bSMarcel Holtmann 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
3333bf5b3c8bSMarcel Holtmann 
333451d167c0SMarcel Holtmann 	return params;
3335bf5b3c8bSMarcel Holtmann }
3336bf5b3c8bSMarcel Holtmann 
3337f6c63249SJohan Hedberg static void hci_conn_params_free(struct hci_conn_params *params)
3338f6c63249SJohan Hedberg {
3339f6c63249SJohan Hedberg 	if (params->conn) {
3340f6c63249SJohan Hedberg 		hci_conn_drop(params->conn);
3341f6c63249SJohan Hedberg 		hci_conn_put(params->conn);
3342f6c63249SJohan Hedberg 	}
3343f6c63249SJohan Hedberg 
3344f6c63249SJohan Hedberg 	list_del(&params->action);
3345f6c63249SJohan Hedberg 	list_del(&params->list);
3346f6c63249SJohan Hedberg 	kfree(params);
3347f6c63249SJohan Hedberg }
3348f6c63249SJohan Hedberg 
334915819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
335015819a70SAndre Guedes void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
335115819a70SAndre Guedes {
335215819a70SAndre Guedes 	struct hci_conn_params *params;
335315819a70SAndre Guedes 
335415819a70SAndre Guedes 	params = hci_conn_params_lookup(hdev, addr, addr_type);
335515819a70SAndre Guedes 	if (!params)
335615819a70SAndre Guedes 		return;
335715819a70SAndre Guedes 
3358f6c63249SJohan Hedberg 	hci_conn_params_free(params);
335915819a70SAndre Guedes 
336095305baaSJohan Hedberg 	hci_update_background_scan(hdev);
336195305baaSJohan Hedberg 
336215819a70SAndre Guedes 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
336315819a70SAndre Guedes }
336415819a70SAndre Guedes 
336515819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
336655af49a8SJohan Hedberg void hci_conn_params_clear_disabled(struct hci_dev *hdev)
336715819a70SAndre Guedes {
336815819a70SAndre Guedes 	struct hci_conn_params *params, *tmp;
336915819a70SAndre Guedes 
337015819a70SAndre Guedes 	list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) {
337155af49a8SJohan Hedberg 		if (params->auto_connect != HCI_AUTO_CONN_DISABLED)
337255af49a8SJohan Hedberg 			continue;
3373f75113a2SJakub Pawlowski 
3374f75113a2SJakub Pawlowski 		/* If trying to estabilish one time connection to disabled
3375f75113a2SJakub Pawlowski 		 * device, leave the params, but mark them as just once.
3376f75113a2SJakub Pawlowski 		 */
3377f75113a2SJakub Pawlowski 		if (params->explicit_connect) {
3378f75113a2SJakub Pawlowski 			params->auto_connect = HCI_AUTO_CONN_EXPLICIT;
3379f75113a2SJakub Pawlowski 			continue;
3380f75113a2SJakub Pawlowski 		}
3381f75113a2SJakub Pawlowski 
338215819a70SAndre Guedes 		list_del(&params->list);
338315819a70SAndre Guedes 		kfree(params);
338415819a70SAndre Guedes 	}
338515819a70SAndre Guedes 
338655af49a8SJohan Hedberg 	BT_DBG("All LE disabled connection parameters were removed");
338755af49a8SJohan Hedberg }
338855af49a8SJohan Hedberg 
338955af49a8SJohan Hedberg /* This function requires the caller holds hdev->lock */
3390030e7f81SJohan Hedberg static void hci_conn_params_clear_all(struct hci_dev *hdev)
339115819a70SAndre Guedes {
339215819a70SAndre Guedes 	struct hci_conn_params *params, *tmp;
339315819a70SAndre Guedes 
3394f6c63249SJohan Hedberg 	list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list)
3395f6c63249SJohan Hedberg 		hci_conn_params_free(params);
339615819a70SAndre Guedes 
339715819a70SAndre Guedes 	BT_DBG("All LE connection parameters were removed");
339815819a70SAndre Guedes }
339915819a70SAndre Guedes 
3400a1f4c318SJohan Hedberg /* Copy the Identity Address of the controller.
3401a1f4c318SJohan Hedberg  *
3402a1f4c318SJohan Hedberg  * If the controller has a public BD_ADDR, then by default use that one.
3403a1f4c318SJohan Hedberg  * If this is a LE only controller without a public address, default to
3404a1f4c318SJohan Hedberg  * the static random address.
3405a1f4c318SJohan Hedberg  *
3406a1f4c318SJohan Hedberg  * For debugging purposes it is possible to force controllers with a
3407a1f4c318SJohan Hedberg  * public address to use the static random address instead.
340850b5b952SMarcel Holtmann  *
340950b5b952SMarcel Holtmann  * In case BR/EDR has been disabled on a dual-mode controller and
341050b5b952SMarcel Holtmann  * userspace has configured a static address, then that address
341150b5b952SMarcel Holtmann  * becomes the identity address instead of the public BR/EDR address.
3412a1f4c318SJohan Hedberg  */
3413a1f4c318SJohan Hedberg void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
3414a1f4c318SJohan Hedberg 			       u8 *bdaddr_type)
3415a1f4c318SJohan Hedberg {
3416b7cb93e5SMarcel Holtmann 	if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
341750b5b952SMarcel Holtmann 	    !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
3418d7a5a11dSMarcel Holtmann 	    (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
341950b5b952SMarcel Holtmann 	     bacmp(&hdev->static_addr, BDADDR_ANY))) {
3420a1f4c318SJohan Hedberg 		bacpy(bdaddr, &hdev->static_addr);
3421a1f4c318SJohan Hedberg 		*bdaddr_type = ADDR_LE_DEV_RANDOM;
3422a1f4c318SJohan Hedberg 	} else {
3423a1f4c318SJohan Hedberg 		bacpy(bdaddr, &hdev->bdaddr);
3424a1f4c318SJohan Hedberg 		*bdaddr_type = ADDR_LE_DEV_PUBLIC;
3425a1f4c318SJohan Hedberg 	}
3426a1f4c318SJohan Hedberg }
3427a1f4c318SJohan Hedberg 
34289952d90eSAbhishek Pandit-Subedi static int hci_suspend_wait_event(struct hci_dev *hdev)
34299952d90eSAbhishek Pandit-Subedi {
34309952d90eSAbhishek Pandit-Subedi #define WAKE_COND                                                              \
34319952d90eSAbhishek Pandit-Subedi 	(find_first_bit(hdev->suspend_tasks, __SUSPEND_NUM_TASKS) ==           \
34329952d90eSAbhishek Pandit-Subedi 	 __SUSPEND_NUM_TASKS)
34339952d90eSAbhishek Pandit-Subedi 
34349952d90eSAbhishek Pandit-Subedi 	int i;
34359952d90eSAbhishek Pandit-Subedi 	int ret = wait_event_timeout(hdev->suspend_wait_q,
34369952d90eSAbhishek Pandit-Subedi 				     WAKE_COND, SUSPEND_NOTIFIER_TIMEOUT);
34379952d90eSAbhishek Pandit-Subedi 
34389952d90eSAbhishek Pandit-Subedi 	if (ret == 0) {
3439a9ec8423SAbhishek Pandit-Subedi 		bt_dev_err(hdev, "Timed out waiting for suspend events");
34409952d90eSAbhishek Pandit-Subedi 		for (i = 0; i < __SUSPEND_NUM_TASKS; ++i) {
34419952d90eSAbhishek Pandit-Subedi 			if (test_bit(i, hdev->suspend_tasks))
3442a9ec8423SAbhishek Pandit-Subedi 				bt_dev_err(hdev, "Suspend timeout bit: %d", i);
34439952d90eSAbhishek Pandit-Subedi 			clear_bit(i, hdev->suspend_tasks);
34449952d90eSAbhishek Pandit-Subedi 		}
34459952d90eSAbhishek Pandit-Subedi 
34469952d90eSAbhishek Pandit-Subedi 		ret = -ETIMEDOUT;
34479952d90eSAbhishek Pandit-Subedi 	} else {
34489952d90eSAbhishek Pandit-Subedi 		ret = 0;
34499952d90eSAbhishek Pandit-Subedi 	}
34509952d90eSAbhishek Pandit-Subedi 
34519952d90eSAbhishek Pandit-Subedi 	return ret;
34529952d90eSAbhishek Pandit-Subedi }
34539952d90eSAbhishek Pandit-Subedi 
34549952d90eSAbhishek Pandit-Subedi static void hci_prepare_suspend(struct work_struct *work)
34559952d90eSAbhishek Pandit-Subedi {
34569952d90eSAbhishek Pandit-Subedi 	struct hci_dev *hdev =
34579952d90eSAbhishek Pandit-Subedi 		container_of(work, struct hci_dev, suspend_prepare);
34589952d90eSAbhishek Pandit-Subedi 
34599952d90eSAbhishek Pandit-Subedi 	hci_dev_lock(hdev);
34609952d90eSAbhishek Pandit-Subedi 	hci_req_prepare_suspend(hdev, hdev->suspend_state_next);
34619952d90eSAbhishek Pandit-Subedi 	hci_dev_unlock(hdev);
34629952d90eSAbhishek Pandit-Subedi }
34639952d90eSAbhishek Pandit-Subedi 
34648731840aSAbhishek Pandit-Subedi static int hci_change_suspend_state(struct hci_dev *hdev,
34658731840aSAbhishek Pandit-Subedi 				    enum suspended_state next)
34668731840aSAbhishek Pandit-Subedi {
34678731840aSAbhishek Pandit-Subedi 	hdev->suspend_state_next = next;
34688731840aSAbhishek Pandit-Subedi 	set_bit(SUSPEND_PREPARE_NOTIFIER, hdev->suspend_tasks);
34698731840aSAbhishek Pandit-Subedi 	queue_work(hdev->req_workqueue, &hdev->suspend_prepare);
34708731840aSAbhishek Pandit-Subedi 	return hci_suspend_wait_event(hdev);
34718731840aSAbhishek Pandit-Subedi }
34728731840aSAbhishek Pandit-Subedi 
34739952d90eSAbhishek Pandit-Subedi static int hci_suspend_notifier(struct notifier_block *nb, unsigned long action,
34749952d90eSAbhishek Pandit-Subedi 				void *data)
34759952d90eSAbhishek Pandit-Subedi {
34769952d90eSAbhishek Pandit-Subedi 	struct hci_dev *hdev =
34779952d90eSAbhishek Pandit-Subedi 		container_of(nb, struct hci_dev, suspend_notifier);
34789952d90eSAbhishek Pandit-Subedi 	int ret = 0;
34799952d90eSAbhishek Pandit-Subedi 
34809952d90eSAbhishek Pandit-Subedi 	/* If powering down, wait for completion. */
34819952d90eSAbhishek Pandit-Subedi 	if (mgmt_powering_down(hdev)) {
34829952d90eSAbhishek Pandit-Subedi 		set_bit(SUSPEND_POWERING_DOWN, hdev->suspend_tasks);
34839952d90eSAbhishek Pandit-Subedi 		ret = hci_suspend_wait_event(hdev);
34849952d90eSAbhishek Pandit-Subedi 		if (ret)
34859952d90eSAbhishek Pandit-Subedi 			goto done;
34869952d90eSAbhishek Pandit-Subedi 	}
34879952d90eSAbhishek Pandit-Subedi 
34889952d90eSAbhishek Pandit-Subedi 	/* Suspend notifier should only act on events when powered. */
34899952d90eSAbhishek Pandit-Subedi 	if (!hdev_is_powered(hdev))
34909952d90eSAbhishek Pandit-Subedi 		goto done;
34919952d90eSAbhishek Pandit-Subedi 
34929952d90eSAbhishek Pandit-Subedi 	if (action == PM_SUSPEND_PREPARE) {
34934f40afc6SAbhishek Pandit-Subedi 		/* Suspend consists of two actions:
34944f40afc6SAbhishek Pandit-Subedi 		 *  - First, disconnect everything and make the controller not
34954f40afc6SAbhishek Pandit-Subedi 		 *    connectable (disabling scanning)
34964f40afc6SAbhishek Pandit-Subedi 		 *  - Second, program event filter/whitelist and enable scan
34974f40afc6SAbhishek Pandit-Subedi 		 */
34988731840aSAbhishek Pandit-Subedi 		ret = hci_change_suspend_state(hdev, BT_SUSPEND_DISCONNECT);
34994f40afc6SAbhishek Pandit-Subedi 
350081dafad5SAbhishek Pandit-Subedi 		/* Only configure whitelist if disconnect succeeded and wake
350181dafad5SAbhishek Pandit-Subedi 		 * isn't being prevented.
350281dafad5SAbhishek Pandit-Subedi 		 */
350381dafad5SAbhishek Pandit-Subedi 		if (!ret && !(hdev->prevent_wake && hdev->prevent_wake(hdev)))
35048731840aSAbhishek Pandit-Subedi 			ret = hci_change_suspend_state(hdev,
35050d2c9825SAbhishek Pandit-Subedi 						BT_SUSPEND_CONFIGURE_WAKE);
35069952d90eSAbhishek Pandit-Subedi 	} else if (action == PM_POST_SUSPEND) {
35078731840aSAbhishek Pandit-Subedi 		ret = hci_change_suspend_state(hdev, BT_RUNNING);
35089952d90eSAbhishek Pandit-Subedi 	}
35099952d90eSAbhishek Pandit-Subedi 
35109952d90eSAbhishek Pandit-Subedi done:
3511a9ec8423SAbhishek Pandit-Subedi 	/* We always allow suspend even if suspend preparation failed and
3512a9ec8423SAbhishek Pandit-Subedi 	 * attempt to recover in resume.
3513a9ec8423SAbhishek Pandit-Subedi 	 */
3514a9ec8423SAbhishek Pandit-Subedi 	if (ret)
3515a9ec8423SAbhishek Pandit-Subedi 		bt_dev_err(hdev, "Suspend notifier action (%lu) failed: %d",
3516a9ec8423SAbhishek Pandit-Subedi 			   action, ret);
3517a9ec8423SAbhishek Pandit-Subedi 
351824b06572SMax Chou 	return NOTIFY_DONE;
35199952d90eSAbhishek Pandit-Subedi }
35208731840aSAbhishek Pandit-Subedi 
35219be0dab7SDavid Herrmann /* Alloc HCI device */
35229be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void)
35239be0dab7SDavid Herrmann {
35249be0dab7SDavid Herrmann 	struct hci_dev *hdev;
35259be0dab7SDavid Herrmann 
352627f70f3eSJohan Hedberg 	hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
35279be0dab7SDavid Herrmann 	if (!hdev)
35289be0dab7SDavid Herrmann 		return NULL;
35299be0dab7SDavid Herrmann 
3530b1b813d4SDavid Herrmann 	hdev->pkt_type  = (HCI_DM1 | HCI_DH1 | HCI_HV1);
3531b1b813d4SDavid Herrmann 	hdev->esco_type = (ESCO_HV1);
3532b1b813d4SDavid Herrmann 	hdev->link_mode = (HCI_LM_ACCEPT);
3533b4cb9fb2SMarcel Holtmann 	hdev->num_iac = 0x01;		/* One IAC support is mandatory */
3534b1b813d4SDavid Herrmann 	hdev->io_capability = 0x03;	/* No Input No Output */
353596c2103aSMarcel Holtmann 	hdev->manufacturer = 0xffff;	/* Default to internal use */
3536bbaf444aSJohan Hedberg 	hdev->inq_tx_power = HCI_TX_POWER_INVALID;
3537bbaf444aSJohan Hedberg 	hdev->adv_tx_power = HCI_TX_POWER_INVALID;
3538d2609b34SFlorian Grandel 	hdev->adv_instance_cnt = 0;
3539d2609b34SFlorian Grandel 	hdev->cur_adv_instance = 0x00;
35405d900e46SFlorian Grandel 	hdev->adv_instance_timeout = 0;
3541b1b813d4SDavid Herrmann 
3542b1b813d4SDavid Herrmann 	hdev->sniff_max_interval = 800;
3543b1b813d4SDavid Herrmann 	hdev->sniff_min_interval = 80;
3544b1b813d4SDavid Herrmann 
35453f959d46SMarcel Holtmann 	hdev->le_adv_channel_map = 0x07;
3546628531c9SGeorg Lukas 	hdev->le_adv_min_interval = 0x0800;
3547628531c9SGeorg Lukas 	hdev->le_adv_max_interval = 0x0800;
3548bef64738SMarcel Holtmann 	hdev->le_scan_interval = 0x0060;
3549bef64738SMarcel Holtmann 	hdev->le_scan_window = 0x0030;
355010873f99SAlain Michaud 	hdev->le_scan_int_suspend = 0x0400;
355110873f99SAlain Michaud 	hdev->le_scan_window_suspend = 0x0012;
355210873f99SAlain Michaud 	hdev->le_scan_int_discovery = DISCOV_LE_SCAN_INT;
355310873f99SAlain Michaud 	hdev->le_scan_window_discovery = DISCOV_LE_SCAN_WIN;
355410873f99SAlain Michaud 	hdev->le_scan_int_connect = 0x0060;
355510873f99SAlain Michaud 	hdev->le_scan_window_connect = 0x0060;
3556b48c3b59SJonas Holmberg 	hdev->le_conn_min_interval = 0x0018;
3557b48c3b59SJonas Holmberg 	hdev->le_conn_max_interval = 0x0028;
355804fb7d90SMarcel Holtmann 	hdev->le_conn_latency = 0x0000;
355904fb7d90SMarcel Holtmann 	hdev->le_supv_timeout = 0x002a;
3560a8e1bfaaSMarcel Holtmann 	hdev->le_def_tx_len = 0x001b;
3561a8e1bfaaSMarcel Holtmann 	hdev->le_def_tx_time = 0x0148;
3562a8e1bfaaSMarcel Holtmann 	hdev->le_max_tx_len = 0x001b;
3563a8e1bfaaSMarcel Holtmann 	hdev->le_max_tx_time = 0x0148;
3564a8e1bfaaSMarcel Holtmann 	hdev->le_max_rx_len = 0x001b;
3565a8e1bfaaSMarcel Holtmann 	hdev->le_max_rx_time = 0x0148;
356630d65e08SMatias Karhumaa 	hdev->le_max_key_size = SMP_MAX_ENC_KEY_SIZE;
356730d65e08SMatias Karhumaa 	hdev->le_min_key_size = SMP_MIN_ENC_KEY_SIZE;
35686decb5b4SJaganath Kanakkassery 	hdev->le_tx_def_phys = HCI_LE_SET_PHY_1M;
35696decb5b4SJaganath Kanakkassery 	hdev->le_rx_def_phys = HCI_LE_SET_PHY_1M;
35701d0fac2cSLuiz Augusto von Dentz 	hdev->le_num_of_adv_sets = HCI_MAX_ADV_INSTANCES;
357110873f99SAlain Michaud 	hdev->def_multi_adv_rotation_duration = HCI_DEFAULT_ADV_DURATION;
357249b020c1SAlain Michaud 	hdev->def_le_autoconnect_timeout = HCI_LE_AUTOCONN_TIMEOUT;
3573bef64738SMarcel Holtmann 
3574d6bfd59cSJohan Hedberg 	hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT;
3575b9a7a61eSLukasz Rymanowski 	hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT;
357631ad1691SAndrzej Kaczmarek 	hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE;
357731ad1691SAndrzej Kaczmarek 	hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE;
3578302975cbSSpoorthi Ravishankar Koppad 	hdev->auth_payload_timeout = DEFAULT_AUTH_PAYLOAD_TIMEOUT;
357958a96fc3SMarcel Holtmann 	hdev->min_enc_key_size = HCI_MIN_ENC_KEY_SIZE;
3580d6bfd59cSJohan Hedberg 
358110873f99SAlain Michaud 	/* default 1.28 sec page scan */
358210873f99SAlain Michaud 	hdev->def_page_scan_type = PAGE_SCAN_TYPE_STANDARD;
358310873f99SAlain Michaud 	hdev->def_page_scan_int = 0x0800;
358410873f99SAlain Michaud 	hdev->def_page_scan_window = 0x0012;
358510873f99SAlain Michaud 
3586b1b813d4SDavid Herrmann 	mutex_init(&hdev->lock);
3587b1b813d4SDavid Herrmann 	mutex_init(&hdev->req_lock);
3588b1b813d4SDavid Herrmann 
3589b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->mgmt_pending);
3590b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->blacklist);
35916659358eSJohan Hedberg 	INIT_LIST_HEAD(&hdev->whitelist);
3592b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->uuids);
3593b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->link_keys);
3594b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->long_term_keys);
3595970c4e46SJohan Hedberg 	INIT_LIST_HEAD(&hdev->identity_resolving_keys);
3596b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->remote_oob_data);
3597d2ab0ac1SMarcel Holtmann 	INIT_LIST_HEAD(&hdev->le_white_list);
3598cfdb0c2dSAnkit Navik 	INIT_LIST_HEAD(&hdev->le_resolv_list);
359915819a70SAndre Guedes 	INIT_LIST_HEAD(&hdev->le_conn_params);
360077a77a30SAndre Guedes 	INIT_LIST_HEAD(&hdev->pend_le_conns);
360166f8455aSJohan Hedberg 	INIT_LIST_HEAD(&hdev->pend_le_reports);
36026b536b5eSAndrei Emeltchenko 	INIT_LIST_HEAD(&hdev->conn_hash.list);
3603d2609b34SFlorian Grandel 	INIT_LIST_HEAD(&hdev->adv_instances);
3604600a8749SAlain Michaud 	INIT_LIST_HEAD(&hdev->blocked_keys);
3605b1b813d4SDavid Herrmann 
3606b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->rx_work, hci_rx_work);
3607b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->cmd_work, hci_cmd_work);
3608b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->tx_work, hci_tx_work);
3609b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->power_on, hci_power_on);
3610c7741d16SMarcel Holtmann 	INIT_WORK(&hdev->error_reset, hci_error_reset);
36119952d90eSAbhishek Pandit-Subedi 	INIT_WORK(&hdev->suspend_prepare, hci_prepare_suspend);
3612b1b813d4SDavid Herrmann 
3613b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
3614b1b813d4SDavid Herrmann 
3615b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->rx_q);
3616b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->cmd_q);
3617b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->raw_q);
3618b1b813d4SDavid Herrmann 
3619b1b813d4SDavid Herrmann 	init_waitqueue_head(&hdev->req_wait_q);
36209952d90eSAbhishek Pandit-Subedi 	init_waitqueue_head(&hdev->suspend_wait_q);
3621b1b813d4SDavid Herrmann 
362265cc2b49SMarcel Holtmann 	INIT_DELAYED_WORK(&hdev->cmd_timer, hci_cmd_timeout);
3623b1b813d4SDavid Herrmann 
36245fc16cc4SJohan Hedberg 	hci_request_setup(hdev);
36255fc16cc4SJohan Hedberg 
3626b1b813d4SDavid Herrmann 	hci_init_sysfs(hdev);
3627b1b813d4SDavid Herrmann 	discovery_init(hdev);
36289be0dab7SDavid Herrmann 
36299be0dab7SDavid Herrmann 	return hdev;
36309be0dab7SDavid Herrmann }
36319be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev);
36329be0dab7SDavid Herrmann 
36339be0dab7SDavid Herrmann /* Free HCI device */
36349be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev)
36359be0dab7SDavid Herrmann {
36369be0dab7SDavid Herrmann 	/* will free via device release */
36379be0dab7SDavid Herrmann 	put_device(&hdev->dev);
36389be0dab7SDavid Herrmann }
36399be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev);
36409be0dab7SDavid Herrmann 
36411da177e4SLinus Torvalds /* Register HCI device */
36421da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev)
36431da177e4SLinus Torvalds {
3644b1b813d4SDavid Herrmann 	int id, error;
36451da177e4SLinus Torvalds 
364674292d5aSMarcel Holtmann 	if (!hdev->open || !hdev->close || !hdev->send)
36471da177e4SLinus Torvalds 		return -EINVAL;
36481da177e4SLinus Torvalds 
364908add513SMat Martineau 	/* Do not allow HCI_AMP devices to register at index 0,
365008add513SMat Martineau 	 * so the index can be used as the AMP controller ID.
365108add513SMat Martineau 	 */
36523df92b31SSasha Levin 	switch (hdev->dev_type) {
3653ca8bee5dSMarcel Holtmann 	case HCI_PRIMARY:
36543df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL);
36551da177e4SLinus Torvalds 		break;
36563df92b31SSasha Levin 	case HCI_AMP:
36573df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL);
36583df92b31SSasha Levin 		break;
36593df92b31SSasha Levin 	default:
36603df92b31SSasha Levin 		return -EINVAL;
36611da177e4SLinus Torvalds 	}
36621da177e4SLinus Torvalds 
36633df92b31SSasha Levin 	if (id < 0)
36643df92b31SSasha Levin 		return id;
36653df92b31SSasha Levin 
36661da177e4SLinus Torvalds 	sprintf(hdev->name, "hci%d", id);
36671da177e4SLinus Torvalds 	hdev->id = id;
36682d8b3a11SAndrei Emeltchenko 
36692d8b3a11SAndrei Emeltchenko 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
36702d8b3a11SAndrei Emeltchenko 
367129e2dd0dSTejun Heo 	hdev->workqueue = alloc_ordered_workqueue("%s", WQ_HIGHPRI, hdev->name);
367233ca954dSDavid Herrmann 	if (!hdev->workqueue) {
367333ca954dSDavid Herrmann 		error = -ENOMEM;
367433ca954dSDavid Herrmann 		goto err;
367533ca954dSDavid Herrmann 	}
3676f48fd9c8SMarcel Holtmann 
367729e2dd0dSTejun Heo 	hdev->req_workqueue = alloc_ordered_workqueue("%s", WQ_HIGHPRI,
367829e2dd0dSTejun Heo 						      hdev->name);
36796ead1bbcSJohan Hedberg 	if (!hdev->req_workqueue) {
36806ead1bbcSJohan Hedberg 		destroy_workqueue(hdev->workqueue);
36816ead1bbcSJohan Hedberg 		error = -ENOMEM;
36826ead1bbcSJohan Hedberg 		goto err;
36836ead1bbcSJohan Hedberg 	}
36846ead1bbcSJohan Hedberg 
36850153e2ecSMarcel Holtmann 	if (!IS_ERR_OR_NULL(bt_debugfs))
36860153e2ecSMarcel Holtmann 		hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
36870153e2ecSMarcel Holtmann 
3688bdc3e0f1SMarcel Holtmann 	dev_set_name(&hdev->dev, "%s", hdev->name);
3689bdc3e0f1SMarcel Holtmann 
3690bdc3e0f1SMarcel Holtmann 	error = device_add(&hdev->dev);
369133ca954dSDavid Herrmann 	if (error < 0)
369254506918SJohan Hedberg 		goto err_wqueue;
36931da177e4SLinus Torvalds 
36946d5d2ee6SHeiner Kallweit 	hci_leds_init(hdev);
36956d5d2ee6SHeiner Kallweit 
3696611b30f7SMarcel Holtmann 	hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev,
3697a8c5fb1aSGustavo Padovan 				    RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops,
3698a8c5fb1aSGustavo Padovan 				    hdev);
3699611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
3700611b30f7SMarcel Holtmann 		if (rfkill_register(hdev->rfkill) < 0) {
3701611b30f7SMarcel Holtmann 			rfkill_destroy(hdev->rfkill);
3702611b30f7SMarcel Holtmann 			hdev->rfkill = NULL;
3703611b30f7SMarcel Holtmann 		}
3704611b30f7SMarcel Holtmann 	}
3705611b30f7SMarcel Holtmann 
37065e130367SJohan Hedberg 	if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
3707a1536da2SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_RFKILLED);
37085e130367SJohan Hedberg 
3709a1536da2SMarcel Holtmann 	hci_dev_set_flag(hdev, HCI_SETUP);
3710a1536da2SMarcel Holtmann 	hci_dev_set_flag(hdev, HCI_AUTO_OFF);
3711ce2be9acSAndrei Emeltchenko 
3712ca8bee5dSMarcel Holtmann 	if (hdev->dev_type == HCI_PRIMARY) {
371356f87901SJohan Hedberg 		/* Assume BR/EDR support until proven otherwise (such as
371456f87901SJohan Hedberg 		 * through reading supported features during init.
371556f87901SJohan Hedberg 		 */
3716a1536da2SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
371756f87901SJohan Hedberg 	}
3718ce2be9acSAndrei Emeltchenko 
3719fcee3377SGustavo Padovan 	write_lock(&hci_dev_list_lock);
3720fcee3377SGustavo Padovan 	list_add(&hdev->list, &hci_dev_list);
3721fcee3377SGustavo Padovan 	write_unlock(&hci_dev_list_lock);
3722fcee3377SGustavo Padovan 
37234a964404SMarcel Holtmann 	/* Devices that are marked for raw-only usage are unconfigured
37244a964404SMarcel Holtmann 	 * and should not be included in normal operation.
3725fee746b0SMarcel Holtmann 	 */
3726fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
3727a1536da2SMarcel Holtmann 		hci_dev_set_flag(hdev, HCI_UNCONFIGURED);
3728fee746b0SMarcel Holtmann 
372905fcd4c4SMarcel Holtmann 	hci_sock_dev_event(hdev, HCI_DEV_REG);
3730dc946bd8SDavid Herrmann 	hci_dev_hold(hdev);
37311da177e4SLinus Torvalds 
37329952d90eSAbhishek Pandit-Subedi 	hdev->suspend_notifier.notifier_call = hci_suspend_notifier;
37339952d90eSAbhishek Pandit-Subedi 	error = register_pm_notifier(&hdev->suspend_notifier);
37349952d90eSAbhishek Pandit-Subedi 	if (error)
37359952d90eSAbhishek Pandit-Subedi 		goto err_wqueue;
37369952d90eSAbhishek Pandit-Subedi 
373719202573SJohan Hedberg 	queue_work(hdev->req_workqueue, &hdev->power_on);
3738fbe96d6fSMarcel Holtmann 
3739e5e1e7fdSMiao-chen Chou 	idr_init(&hdev->adv_monitors_idr);
3740e5e1e7fdSMiao-chen Chou 
37411da177e4SLinus Torvalds 	return id;
3742f48fd9c8SMarcel Holtmann 
374333ca954dSDavid Herrmann err_wqueue:
374433ca954dSDavid Herrmann 	destroy_workqueue(hdev->workqueue);
37456ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
374633ca954dSDavid Herrmann err:
37473df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, hdev->id);
3748f48fd9c8SMarcel Holtmann 
374933ca954dSDavid Herrmann 	return error;
37501da177e4SLinus Torvalds }
37511da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev);
37521da177e4SLinus Torvalds 
37531da177e4SLinus Torvalds /* Unregister HCI device */
375459735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev)
37551da177e4SLinus Torvalds {
37562d7cc19eSMarcel Holtmann 	int id;
3757ef222013SMarcel Holtmann 
3758c13854ceSMarcel Holtmann 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
37591da177e4SLinus Torvalds 
3760a1536da2SMarcel Holtmann 	hci_dev_set_flag(hdev, HCI_UNREGISTER);
376194324962SJohan Hovold 
37623df92b31SSasha Levin 	id = hdev->id;
37633df92b31SSasha Levin 
3764f20d09d5SGustavo F. Padovan 	write_lock(&hci_dev_list_lock);
37651da177e4SLinus Torvalds 	list_del(&hdev->list);
3766f20d09d5SGustavo F. Padovan 	write_unlock(&hci_dev_list_lock);
37671da177e4SLinus Torvalds 
3768b9b5ef18SGustavo Padovan 	cancel_work_sync(&hdev->power_on);
3769b9b5ef18SGustavo Padovan 
3770bf389cabSJiri Slaby 	hci_dev_do_close(hdev);
3771bf389cabSJiri Slaby 
37729952d90eSAbhishek Pandit-Subedi 	unregister_pm_notifier(&hdev->suspend_notifier);
37739952d90eSAbhishek Pandit-Subedi 
3774ab81cbf9SJohan Hedberg 	if (!test_bit(HCI_INIT, &hdev->flags) &&
3775d7a5a11dSMarcel Holtmann 	    !hci_dev_test_flag(hdev, HCI_SETUP) &&
3776d7a5a11dSMarcel Holtmann 	    !hci_dev_test_flag(hdev, HCI_CONFIG)) {
377709fd0de5SGustavo F. Padovan 		hci_dev_lock(hdev);
3778744cf19eSJohan Hedberg 		mgmt_index_removed(hdev);
377909fd0de5SGustavo F. Padovan 		hci_dev_unlock(hdev);
378056e5cb86SJohan Hedberg 	}
3781ab81cbf9SJohan Hedberg 
37822e58ef3eSJohan Hedberg 	/* mgmt_index_removed should take care of emptying the
37832e58ef3eSJohan Hedberg 	 * pending list */
37842e58ef3eSJohan Hedberg 	BUG_ON(!list_empty(&hdev->mgmt_pending));
37852e58ef3eSJohan Hedberg 
378605fcd4c4SMarcel Holtmann 	hci_sock_dev_event(hdev, HCI_DEV_UNREG);
37871da177e4SLinus Torvalds 
3788611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
3789611b30f7SMarcel Holtmann 		rfkill_unregister(hdev->rfkill);
3790611b30f7SMarcel Holtmann 		rfkill_destroy(hdev->rfkill);
3791611b30f7SMarcel Holtmann 	}
3792611b30f7SMarcel Holtmann 
3793bdc3e0f1SMarcel Holtmann 	device_del(&hdev->dev);
3794147e2d59SDave Young 
37950153e2ecSMarcel Holtmann 	debugfs_remove_recursive(hdev->debugfs);
37965177a838SMarcel Holtmann 	kfree_const(hdev->hw_info);
37975177a838SMarcel Holtmann 	kfree_const(hdev->fw_info);
37980153e2ecSMarcel Holtmann 
3799f48fd9c8SMarcel Holtmann 	destroy_workqueue(hdev->workqueue);
38006ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
3801f48fd9c8SMarcel Holtmann 
380209fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
3803dcc36c16SJohan Hedberg 	hci_bdaddr_list_clear(&hdev->blacklist);
38046659358eSJohan Hedberg 	hci_bdaddr_list_clear(&hdev->whitelist);
38052aeb9a1aSJohan Hedberg 	hci_uuids_clear(hdev);
380655ed8ca1SJohan Hedberg 	hci_link_keys_clear(hdev);
3807b899efafSVinicius Costa Gomes 	hci_smp_ltks_clear(hdev);
3808970c4e46SJohan Hedberg 	hci_smp_irks_clear(hdev);
38092763eda6SSzymon Janc 	hci_remote_oob_data_clear(hdev);
3810d2609b34SFlorian Grandel 	hci_adv_instances_clear(hdev);
3811e5e1e7fdSMiao-chen Chou 	hci_adv_monitors_clear(hdev);
3812dcc36c16SJohan Hedberg 	hci_bdaddr_list_clear(&hdev->le_white_list);
3813cfdb0c2dSAnkit Navik 	hci_bdaddr_list_clear(&hdev->le_resolv_list);
3814373110c5SJohan Hedberg 	hci_conn_params_clear_all(hdev);
381522078800SMarcel Holtmann 	hci_discovery_filter_clear(hdev);
3816600a8749SAlain Michaud 	hci_blocked_keys_clear(hdev);
381709fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
3818e2e0cacbSJohan Hedberg 
3819dc946bd8SDavid Herrmann 	hci_dev_put(hdev);
38203df92b31SSasha Levin 
38213df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, id);
38221da177e4SLinus Torvalds }
38231da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev);
38241da177e4SLinus Torvalds 
38251da177e4SLinus Torvalds /* Suspend HCI device */
38261da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev)
38271da177e4SLinus Torvalds {
382805fcd4c4SMarcel Holtmann 	hci_sock_dev_event(hdev, HCI_DEV_SUSPEND);
38291da177e4SLinus Torvalds 	return 0;
38301da177e4SLinus Torvalds }
38311da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev);
38321da177e4SLinus Torvalds 
38331da177e4SLinus Torvalds /* Resume HCI device */
38341da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev)
38351da177e4SLinus Torvalds {
383605fcd4c4SMarcel Holtmann 	hci_sock_dev_event(hdev, HCI_DEV_RESUME);
38371da177e4SLinus Torvalds 	return 0;
38381da177e4SLinus Torvalds }
38391da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev);
38401da177e4SLinus Torvalds 
384175e0569fSMarcel Holtmann /* Reset HCI device */
384275e0569fSMarcel Holtmann int hci_reset_dev(struct hci_dev *hdev)
384375e0569fSMarcel Holtmann {
38441e4b6e91SColin Ian King 	static const u8 hw_err[] = { HCI_EV_HARDWARE_ERROR, 0x01, 0x00 };
384575e0569fSMarcel Holtmann 	struct sk_buff *skb;
384675e0569fSMarcel Holtmann 
384775e0569fSMarcel Holtmann 	skb = bt_skb_alloc(3, GFP_ATOMIC);
384875e0569fSMarcel Holtmann 	if (!skb)
384975e0569fSMarcel Holtmann 		return -ENOMEM;
385075e0569fSMarcel Holtmann 
3851d79f34e3SMarcel Holtmann 	hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
385259ae1d12SJohannes Berg 	skb_put_data(skb, hw_err, 3);
385375e0569fSMarcel Holtmann 
385475e0569fSMarcel Holtmann 	/* Send Hardware Error to upper stack */
385575e0569fSMarcel Holtmann 	return hci_recv_frame(hdev, skb);
385675e0569fSMarcel Holtmann }
385775e0569fSMarcel Holtmann EXPORT_SYMBOL(hci_reset_dev);
385875e0569fSMarcel Holtmann 
385976bca880SMarcel Holtmann /* Receive frame from HCI drivers */
3860e1a26170SMarcel Holtmann int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
386176bca880SMarcel Holtmann {
386276bca880SMarcel Holtmann 	if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
386376bca880SMarcel Holtmann 		      && !test_bit(HCI_INIT, &hdev->flags))) {
386476bca880SMarcel Holtmann 		kfree_skb(skb);
386576bca880SMarcel Holtmann 		return -ENXIO;
386676bca880SMarcel Holtmann 	}
386776bca880SMarcel Holtmann 
3868d79f34e3SMarcel Holtmann 	if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT &&
3869d79f34e3SMarcel Holtmann 	    hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
3870cc974003SMarcel Holtmann 	    hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
3871cc974003SMarcel Holtmann 	    hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) {
3872fe806dceSMarcel Holtmann 		kfree_skb(skb);
3873fe806dceSMarcel Holtmann 		return -EINVAL;
3874fe806dceSMarcel Holtmann 	}
3875fe806dceSMarcel Holtmann 
3876d82603c6SJorrit Schippers 	/* Incoming skb */
387776bca880SMarcel Holtmann 	bt_cb(skb)->incoming = 1;
387876bca880SMarcel Holtmann 
387976bca880SMarcel Holtmann 	/* Time stamp */
388076bca880SMarcel Holtmann 	__net_timestamp(skb);
388176bca880SMarcel Holtmann 
388276bca880SMarcel Holtmann 	skb_queue_tail(&hdev->rx_q, skb);
3883b78752ccSMarcel Holtmann 	queue_work(hdev->workqueue, &hdev->rx_work);
3884c78ae283SMarcel Holtmann 
388576bca880SMarcel Holtmann 	return 0;
388676bca880SMarcel Holtmann }
388776bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame);
388876bca880SMarcel Holtmann 
3889e875ff84SMarcel Holtmann /* Receive diagnostic message from HCI drivers */
3890e875ff84SMarcel Holtmann int hci_recv_diag(struct hci_dev *hdev, struct sk_buff *skb)
3891e875ff84SMarcel Holtmann {
3892581d6fd6SMarcel Holtmann 	/* Mark as diagnostic packet */
3893d79f34e3SMarcel Holtmann 	hci_skb_pkt_type(skb) = HCI_DIAG_PKT;
3894581d6fd6SMarcel Holtmann 
3895e875ff84SMarcel Holtmann 	/* Time stamp */
3896e875ff84SMarcel Holtmann 	__net_timestamp(skb);
3897e875ff84SMarcel Holtmann 
3898581d6fd6SMarcel Holtmann 	skb_queue_tail(&hdev->rx_q, skb);
3899581d6fd6SMarcel Holtmann 	queue_work(hdev->workqueue, &hdev->rx_work);
3900e875ff84SMarcel Holtmann 
3901e875ff84SMarcel Holtmann 	return 0;
3902e875ff84SMarcel Holtmann }
3903e875ff84SMarcel Holtmann EXPORT_SYMBOL(hci_recv_diag);
3904e875ff84SMarcel Holtmann 
39055177a838SMarcel Holtmann void hci_set_hw_info(struct hci_dev *hdev, const char *fmt, ...)
39065177a838SMarcel Holtmann {
39075177a838SMarcel Holtmann 	va_list vargs;
39085177a838SMarcel Holtmann 
39095177a838SMarcel Holtmann 	va_start(vargs, fmt);
39105177a838SMarcel Holtmann 	kfree_const(hdev->hw_info);
39115177a838SMarcel Holtmann 	hdev->hw_info = kvasprintf_const(GFP_KERNEL, fmt, vargs);
39125177a838SMarcel Holtmann 	va_end(vargs);
39135177a838SMarcel Holtmann }
39145177a838SMarcel Holtmann EXPORT_SYMBOL(hci_set_hw_info);
39155177a838SMarcel Holtmann 
39165177a838SMarcel Holtmann void hci_set_fw_info(struct hci_dev *hdev, const char *fmt, ...)
39175177a838SMarcel Holtmann {
39185177a838SMarcel Holtmann 	va_list vargs;
39195177a838SMarcel Holtmann 
39205177a838SMarcel Holtmann 	va_start(vargs, fmt);
39215177a838SMarcel Holtmann 	kfree_const(hdev->fw_info);
39225177a838SMarcel Holtmann 	hdev->fw_info = kvasprintf_const(GFP_KERNEL, fmt, vargs);
39235177a838SMarcel Holtmann 	va_end(vargs);
39245177a838SMarcel Holtmann }
39255177a838SMarcel Holtmann EXPORT_SYMBOL(hci_set_fw_info);
39265177a838SMarcel Holtmann 
39271da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */
39281da177e4SLinus Torvalds 
39291da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb)
39301da177e4SLinus Torvalds {
39311da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
39321da177e4SLinus Torvalds 
3933fba7ecf0SJohan Hedberg 	mutex_lock(&hci_cb_list_lock);
393400629e0fSJohan Hedberg 	list_add_tail(&cb->list, &hci_cb_list);
3935fba7ecf0SJohan Hedberg 	mutex_unlock(&hci_cb_list_lock);
39361da177e4SLinus Torvalds 
39371da177e4SLinus Torvalds 	return 0;
39381da177e4SLinus Torvalds }
39391da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb);
39401da177e4SLinus Torvalds 
39411da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb)
39421da177e4SLinus Torvalds {
39431da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
39441da177e4SLinus Torvalds 
3945fba7ecf0SJohan Hedberg 	mutex_lock(&hci_cb_list_lock);
39461da177e4SLinus Torvalds 	list_del(&cb->list);
3947fba7ecf0SJohan Hedberg 	mutex_unlock(&hci_cb_list_lock);
39481da177e4SLinus Torvalds 
39491da177e4SLinus Torvalds 	return 0;
39501da177e4SLinus Torvalds }
39511da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb);
39521da177e4SLinus Torvalds 
395351086991SMarcel Holtmann static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
39541da177e4SLinus Torvalds {
3955cdc52faaSMarcel Holtmann 	int err;
3956cdc52faaSMarcel Holtmann 
3957d79f34e3SMarcel Holtmann 	BT_DBG("%s type %d len %d", hdev->name, hci_skb_pkt_type(skb),
3958d79f34e3SMarcel Holtmann 	       skb->len);
39591da177e4SLinus Torvalds 
39601da177e4SLinus Torvalds 	/* Time stamp */
3961a61bbcf2SPatrick McHardy 	__net_timestamp(skb);
39621da177e4SLinus Torvalds 
3963cd82e61cSMarcel Holtmann 	/* Send copy to monitor */
3964cd82e61cSMarcel Holtmann 	hci_send_to_monitor(hdev, skb);
3965cd82e61cSMarcel Holtmann 
3966cd82e61cSMarcel Holtmann 	if (atomic_read(&hdev->promisc)) {
3967cd82e61cSMarcel Holtmann 		/* Send copy to the sockets */
3968470fe1b5SMarcel Holtmann 		hci_send_to_sock(hdev, skb);
39691da177e4SLinus Torvalds 	}
39701da177e4SLinus Torvalds 
39711da177e4SLinus Torvalds 	/* Get rid of skb owner, prior to sending to the driver. */
39721da177e4SLinus Torvalds 	skb_orphan(skb);
39731da177e4SLinus Torvalds 
397473d0d3c8SMarcel Holtmann 	if (!test_bit(HCI_RUNNING, &hdev->flags)) {
397573d0d3c8SMarcel Holtmann 		kfree_skb(skb);
397673d0d3c8SMarcel Holtmann 		return;
397773d0d3c8SMarcel Holtmann 	}
397873d0d3c8SMarcel Holtmann 
3979cdc52faaSMarcel Holtmann 	err = hdev->send(hdev, skb);
3980cdc52faaSMarcel Holtmann 	if (err < 0) {
39812064ee33SMarcel Holtmann 		bt_dev_err(hdev, "sending frame failed (%d)", err);
3982cdc52faaSMarcel Holtmann 		kfree_skb(skb);
3983cdc52faaSMarcel Holtmann 	}
39841da177e4SLinus Torvalds }
39851da177e4SLinus Torvalds 
39861ca3a9d0SJohan Hedberg /* Send HCI command */
398707dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
398807dc93ddSJohan Hedberg 		 const void *param)
39891ca3a9d0SJohan Hedberg {
39901ca3a9d0SJohan Hedberg 	struct sk_buff *skb;
39911ca3a9d0SJohan Hedberg 
39921ca3a9d0SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
39931ca3a9d0SJohan Hedberg 
39941ca3a9d0SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
39951ca3a9d0SJohan Hedberg 	if (!skb) {
39962064ee33SMarcel Holtmann 		bt_dev_err(hdev, "no memory for command");
39971ca3a9d0SJohan Hedberg 		return -ENOMEM;
39981ca3a9d0SJohan Hedberg 	}
39991ca3a9d0SJohan Hedberg 
400049c922bbSStephen Hemminger 	/* Stand-alone HCI commands must be flagged as
400111714b3dSJohan Hedberg 	 * single-command requests.
400211714b3dSJohan Hedberg 	 */
400344d27137SJohan Hedberg 	bt_cb(skb)->hci.req_flags |= HCI_REQ_START;
400411714b3dSJohan Hedberg 
40051da177e4SLinus Torvalds 	skb_queue_tail(&hdev->cmd_q, skb);
4006c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
40071da177e4SLinus Torvalds 
40081da177e4SLinus Torvalds 	return 0;
40091da177e4SLinus Torvalds }
40101da177e4SLinus Torvalds 
4011d6ee6ad7SLoic Poulain int __hci_cmd_send(struct hci_dev *hdev, u16 opcode, u32 plen,
4012d6ee6ad7SLoic Poulain 		   const void *param)
4013d6ee6ad7SLoic Poulain {
4014d6ee6ad7SLoic Poulain 	struct sk_buff *skb;
4015d6ee6ad7SLoic Poulain 
4016d6ee6ad7SLoic Poulain 	if (hci_opcode_ogf(opcode) != 0x3f) {
4017d6ee6ad7SLoic Poulain 		/* A controller receiving a command shall respond with either
4018d6ee6ad7SLoic Poulain 		 * a Command Status Event or a Command Complete Event.
4019d6ee6ad7SLoic Poulain 		 * Therefore, all standard HCI commands must be sent via the
4020d6ee6ad7SLoic Poulain 		 * standard API, using hci_send_cmd or hci_cmd_sync helpers.
4021d6ee6ad7SLoic Poulain 		 * Some vendors do not comply with this rule for vendor-specific
4022d6ee6ad7SLoic Poulain 		 * commands and do not return any event. We want to support
4023d6ee6ad7SLoic Poulain 		 * unresponded commands for such cases only.
4024d6ee6ad7SLoic Poulain 		 */
4025d6ee6ad7SLoic Poulain 		bt_dev_err(hdev, "unresponded command not supported");
4026d6ee6ad7SLoic Poulain 		return -EINVAL;
4027d6ee6ad7SLoic Poulain 	}
4028d6ee6ad7SLoic Poulain 
4029d6ee6ad7SLoic Poulain 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
4030d6ee6ad7SLoic Poulain 	if (!skb) {
4031d6ee6ad7SLoic Poulain 		bt_dev_err(hdev, "no memory for command (opcode 0x%4.4x)",
4032d6ee6ad7SLoic Poulain 			   opcode);
4033d6ee6ad7SLoic Poulain 		return -ENOMEM;
4034d6ee6ad7SLoic Poulain 	}
4035d6ee6ad7SLoic Poulain 
4036d6ee6ad7SLoic Poulain 	hci_send_frame(hdev, skb);
4037d6ee6ad7SLoic Poulain 
4038d6ee6ad7SLoic Poulain 	return 0;
4039d6ee6ad7SLoic Poulain }
4040d6ee6ad7SLoic Poulain EXPORT_SYMBOL(__hci_cmd_send);
4041d6ee6ad7SLoic Poulain 
40421da177e4SLinus Torvalds /* Get data from the previously sent command */
4043a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
40441da177e4SLinus Torvalds {
40451da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
40461da177e4SLinus Torvalds 
40471da177e4SLinus Torvalds 	if (!hdev->sent_cmd)
40481da177e4SLinus Torvalds 		return NULL;
40491da177e4SLinus Torvalds 
40501da177e4SLinus Torvalds 	hdr = (void *) hdev->sent_cmd->data;
40511da177e4SLinus Torvalds 
4052a9de9248SMarcel Holtmann 	if (hdr->opcode != cpu_to_le16(opcode))
40531da177e4SLinus Torvalds 		return NULL;
40541da177e4SLinus Torvalds 
4055f0e09510SAndrei Emeltchenko 	BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
40561da177e4SLinus Torvalds 
40571da177e4SLinus Torvalds 	return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
40581da177e4SLinus Torvalds }
40591da177e4SLinus Torvalds 
4060fbef168fSLoic Poulain /* Send HCI command and wait for command commplete event */
4061fbef168fSLoic Poulain struct sk_buff *hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
4062fbef168fSLoic Poulain 			     const void *param, u32 timeout)
4063fbef168fSLoic Poulain {
4064fbef168fSLoic Poulain 	struct sk_buff *skb;
4065fbef168fSLoic Poulain 
4066fbef168fSLoic Poulain 	if (!test_bit(HCI_UP, &hdev->flags))
4067fbef168fSLoic Poulain 		return ERR_PTR(-ENETDOWN);
4068fbef168fSLoic Poulain 
4069fbef168fSLoic Poulain 	bt_dev_dbg(hdev, "opcode 0x%4.4x plen %d", opcode, plen);
4070fbef168fSLoic Poulain 
4071b504430cSJohan Hedberg 	hci_req_sync_lock(hdev);
4072fbef168fSLoic Poulain 	skb = __hci_cmd_sync(hdev, opcode, plen, param, timeout);
4073b504430cSJohan Hedberg 	hci_req_sync_unlock(hdev);
4074fbef168fSLoic Poulain 
4075fbef168fSLoic Poulain 	return skb;
4076fbef168fSLoic Poulain }
4077fbef168fSLoic Poulain EXPORT_SYMBOL(hci_cmd_sync);
4078fbef168fSLoic Poulain 
40791da177e4SLinus Torvalds /* Send ACL data */
40801da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags)
40811da177e4SLinus Torvalds {
40821da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr;
40831da177e4SLinus Torvalds 	int len = skb->len;
40841da177e4SLinus Torvalds 
4085badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_ACL_HDR_SIZE);
4086badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
40879c70220bSArnaldo Carvalho de Melo 	hdr = (struct hci_acl_hdr *)skb_transport_header(skb);
4088aca3192cSYOSHIFUJI Hideaki 	hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags));
4089aca3192cSYOSHIFUJI Hideaki 	hdr->dlen   = cpu_to_le16(len);
40901da177e4SLinus Torvalds }
40911da177e4SLinus Torvalds 
4092ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
409373d80debSLuiz Augusto von Dentz 			  struct sk_buff *skb, __u16 flags)
40941da177e4SLinus Torvalds {
4095ee22be7eSAndrei Emeltchenko 	struct hci_conn *conn = chan->conn;
40961da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
40971da177e4SLinus Torvalds 	struct sk_buff *list;
40981da177e4SLinus Torvalds 
4099087bfd99SGustavo Padovan 	skb->len = skb_headlen(skb);
4100087bfd99SGustavo Padovan 	skb->data_len = 0;
4101087bfd99SGustavo Padovan 
4102d79f34e3SMarcel Holtmann 	hci_skb_pkt_type(skb) = HCI_ACLDATA_PKT;
4103204a6e54SAndrei Emeltchenko 
4104204a6e54SAndrei Emeltchenko 	switch (hdev->dev_type) {
4105ca8bee5dSMarcel Holtmann 	case HCI_PRIMARY:
4106087bfd99SGustavo Padovan 		hci_add_acl_hdr(skb, conn->handle, flags);
4107204a6e54SAndrei Emeltchenko 		break;
4108204a6e54SAndrei Emeltchenko 	case HCI_AMP:
4109204a6e54SAndrei Emeltchenko 		hci_add_acl_hdr(skb, chan->handle, flags);
4110204a6e54SAndrei Emeltchenko 		break;
4111204a6e54SAndrei Emeltchenko 	default:
41122064ee33SMarcel Holtmann 		bt_dev_err(hdev, "unknown dev_type %d", hdev->dev_type);
4113204a6e54SAndrei Emeltchenko 		return;
4114204a6e54SAndrei Emeltchenko 	}
4115087bfd99SGustavo Padovan 
411670f23020SAndrei Emeltchenko 	list = skb_shinfo(skb)->frag_list;
411770f23020SAndrei Emeltchenko 	if (!list) {
41181da177e4SLinus Torvalds 		/* Non fragmented */
41191da177e4SLinus Torvalds 		BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len);
41201da177e4SLinus Torvalds 
412173d80debSLuiz Augusto von Dentz 		skb_queue_tail(queue, skb);
41221da177e4SLinus Torvalds 	} else {
41231da177e4SLinus Torvalds 		/* Fragmented */
41241da177e4SLinus Torvalds 		BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
41251da177e4SLinus Torvalds 
41261da177e4SLinus Torvalds 		skb_shinfo(skb)->frag_list = NULL;
41271da177e4SLinus Torvalds 
41289cfd5a23SJukka Rissanen 		/* Queue all fragments atomically. We need to use spin_lock_bh
41299cfd5a23SJukka Rissanen 		 * here because of 6LoWPAN links, as there this function is
41309cfd5a23SJukka Rissanen 		 * called from softirq and using normal spin lock could cause
41319cfd5a23SJukka Rissanen 		 * deadlocks.
41329cfd5a23SJukka Rissanen 		 */
41339cfd5a23SJukka Rissanen 		spin_lock_bh(&queue->lock);
41341da177e4SLinus Torvalds 
413573d80debSLuiz Augusto von Dentz 		__skb_queue_tail(queue, skb);
4136e702112fSAndrei Emeltchenko 
4137e702112fSAndrei Emeltchenko 		flags &= ~ACL_START;
4138e702112fSAndrei Emeltchenko 		flags |= ACL_CONT;
41391da177e4SLinus Torvalds 		do {
41401da177e4SLinus Torvalds 			skb = list; list = list->next;
41411da177e4SLinus Torvalds 
4142d79f34e3SMarcel Holtmann 			hci_skb_pkt_type(skb) = HCI_ACLDATA_PKT;
4143e702112fSAndrei Emeltchenko 			hci_add_acl_hdr(skb, conn->handle, flags);
41441da177e4SLinus Torvalds 
41451da177e4SLinus Torvalds 			BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
41461da177e4SLinus Torvalds 
414773d80debSLuiz Augusto von Dentz 			__skb_queue_tail(queue, skb);
41481da177e4SLinus Torvalds 		} while (list);
41491da177e4SLinus Torvalds 
41509cfd5a23SJukka Rissanen 		spin_unlock_bh(&queue->lock);
41511da177e4SLinus Torvalds 	}
415273d80debSLuiz Augusto von Dentz }
415373d80debSLuiz Augusto von Dentz 
415473d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
415573d80debSLuiz Augusto von Dentz {
4156ee22be7eSAndrei Emeltchenko 	struct hci_dev *hdev = chan->conn->hdev;
415773d80debSLuiz Augusto von Dentz 
4158f0e09510SAndrei Emeltchenko 	BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags);
415973d80debSLuiz Augusto von Dentz 
4160ee22be7eSAndrei Emeltchenko 	hci_queue_acl(chan, &chan->data_q, skb, flags);
41611da177e4SLinus Torvalds 
41623eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
41631da177e4SLinus Torvalds }
41641da177e4SLinus Torvalds 
41651da177e4SLinus Torvalds /* Send SCO data */
41660d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
41671da177e4SLinus Torvalds {
41681da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
41691da177e4SLinus Torvalds 	struct hci_sco_hdr hdr;
41701da177e4SLinus Torvalds 
41711da177e4SLinus Torvalds 	BT_DBG("%s len %d", hdev->name, skb->len);
41721da177e4SLinus Torvalds 
4173aca3192cSYOSHIFUJI Hideaki 	hdr.handle = cpu_to_le16(conn->handle);
41741da177e4SLinus Torvalds 	hdr.dlen   = skb->len;
41751da177e4SLinus Torvalds 
4176badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_SCO_HDR_SIZE);
4177badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
41789c70220bSArnaldo Carvalho de Melo 	memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE);
41791da177e4SLinus Torvalds 
4180d79f34e3SMarcel Holtmann 	hci_skb_pkt_type(skb) = HCI_SCODATA_PKT;
4181c78ae283SMarcel Holtmann 
41821da177e4SLinus Torvalds 	skb_queue_tail(&conn->data_q, skb);
41833eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
41841da177e4SLinus Torvalds }
41851da177e4SLinus Torvalds 
41861da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */
41871da177e4SLinus Torvalds 
41881da177e4SLinus Torvalds /* HCI Connection scheduler */
41896039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
4190a8c5fb1aSGustavo Padovan 				     int *quote)
41911da177e4SLinus Torvalds {
41921da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
41938035ded4SLuiz Augusto von Dentz 	struct hci_conn *conn = NULL, *c;
4194abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0;
41951da177e4SLinus Torvalds 
41961da177e4SLinus Torvalds 	/* We don't have to lock device here. Connections are always
41971da177e4SLinus Torvalds 	 * added and removed with TX task disabled. */
4198bf4c6325SGustavo F. Padovan 
4199bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4200bf4c6325SGustavo F. Padovan 
4201bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
4202769be974SMarcel Holtmann 		if (c->type != type || skb_queue_empty(&c->data_q))
42031da177e4SLinus Torvalds 			continue;
4204769be974SMarcel Holtmann 
4205769be974SMarcel Holtmann 		if (c->state != BT_CONNECTED && c->state != BT_CONFIG)
4206769be974SMarcel Holtmann 			continue;
4207769be974SMarcel Holtmann 
42081da177e4SLinus Torvalds 		num++;
42091da177e4SLinus Torvalds 
42101da177e4SLinus Torvalds 		if (c->sent < min) {
42111da177e4SLinus Torvalds 			min  = c->sent;
42121da177e4SLinus Torvalds 			conn = c;
42131da177e4SLinus Torvalds 		}
421452087a79SLuiz Augusto von Dentz 
421552087a79SLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
421652087a79SLuiz Augusto von Dentz 			break;
42171da177e4SLinus Torvalds 	}
42181da177e4SLinus Torvalds 
4219bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4220bf4c6325SGustavo F. Padovan 
42211da177e4SLinus Torvalds 	if (conn) {
42226ed58ec5SVille Tervo 		int cnt, q;
42236ed58ec5SVille Tervo 
42246ed58ec5SVille Tervo 		switch (conn->type) {
42256ed58ec5SVille Tervo 		case ACL_LINK:
42266ed58ec5SVille Tervo 			cnt = hdev->acl_cnt;
42276ed58ec5SVille Tervo 			break;
42286ed58ec5SVille Tervo 		case SCO_LINK:
42296ed58ec5SVille Tervo 		case ESCO_LINK:
42306ed58ec5SVille Tervo 			cnt = hdev->sco_cnt;
42316ed58ec5SVille Tervo 			break;
42326ed58ec5SVille Tervo 		case LE_LINK:
42336ed58ec5SVille Tervo 			cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
42346ed58ec5SVille Tervo 			break;
42356ed58ec5SVille Tervo 		default:
42366ed58ec5SVille Tervo 			cnt = 0;
42372064ee33SMarcel Holtmann 			bt_dev_err(hdev, "unknown link type %d", conn->type);
42386ed58ec5SVille Tervo 		}
42396ed58ec5SVille Tervo 
42406ed58ec5SVille Tervo 		q = cnt / num;
42411da177e4SLinus Torvalds 		*quote = q ? q : 1;
42421da177e4SLinus Torvalds 	} else
42431da177e4SLinus Torvalds 		*quote = 0;
42441da177e4SLinus Torvalds 
42451da177e4SLinus Torvalds 	BT_DBG("conn %p quote %d", conn, *quote);
42461da177e4SLinus Torvalds 	return conn;
42471da177e4SLinus Torvalds }
42481da177e4SLinus Torvalds 
42496039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
42501da177e4SLinus Torvalds {
42511da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
42521da177e4SLinus Torvalds 	struct hci_conn *c;
42531da177e4SLinus Torvalds 
42542064ee33SMarcel Holtmann 	bt_dev_err(hdev, "link tx timeout");
42551da177e4SLinus Torvalds 
4256bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4257bf4c6325SGustavo F. Padovan 
42581da177e4SLinus Torvalds 	/* Kill stalled connections */
4259bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
4260bae1f5d9SVille Tervo 		if (c->type == type && c->sent) {
42612064ee33SMarcel Holtmann 			bt_dev_err(hdev, "killing stalled connection %pMR",
42622064ee33SMarcel Holtmann 				   &c->dst);
4263bed71748SAndre Guedes 			hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
42641da177e4SLinus Torvalds 		}
42651da177e4SLinus Torvalds 	}
4266bf4c6325SGustavo F. Padovan 
4267bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
42681da177e4SLinus Torvalds }
42691da177e4SLinus Torvalds 
42706039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
427173d80debSLuiz Augusto von Dentz 				      int *quote)
427273d80debSLuiz Augusto von Dentz {
427373d80debSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
427473d80debSLuiz Augusto von Dentz 	struct hci_chan *chan = NULL;
4275abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0, cur_prio = 0;
427673d80debSLuiz Augusto von Dentz 	struct hci_conn *conn;
427773d80debSLuiz Augusto von Dentz 	int cnt, q, conn_num = 0;
427873d80debSLuiz Augusto von Dentz 
427973d80debSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
428073d80debSLuiz Augusto von Dentz 
4281bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4282bf4c6325SGustavo F. Padovan 
4283bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
428473d80debSLuiz Augusto von Dentz 		struct hci_chan *tmp;
428573d80debSLuiz Augusto von Dentz 
428673d80debSLuiz Augusto von Dentz 		if (conn->type != type)
428773d80debSLuiz Augusto von Dentz 			continue;
428873d80debSLuiz Augusto von Dentz 
428973d80debSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
429073d80debSLuiz Augusto von Dentz 			continue;
429173d80debSLuiz Augusto von Dentz 
429273d80debSLuiz Augusto von Dentz 		conn_num++;
429373d80debSLuiz Augusto von Dentz 
42948192edefSGustavo F. Padovan 		list_for_each_entry_rcu(tmp, &conn->chan_list, list) {
429573d80debSLuiz Augusto von Dentz 			struct sk_buff *skb;
429673d80debSLuiz Augusto von Dentz 
429773d80debSLuiz Augusto von Dentz 			if (skb_queue_empty(&tmp->data_q))
429873d80debSLuiz Augusto von Dentz 				continue;
429973d80debSLuiz Augusto von Dentz 
430073d80debSLuiz Augusto von Dentz 			skb = skb_peek(&tmp->data_q);
430173d80debSLuiz Augusto von Dentz 			if (skb->priority < cur_prio)
430273d80debSLuiz Augusto von Dentz 				continue;
430373d80debSLuiz Augusto von Dentz 
430473d80debSLuiz Augusto von Dentz 			if (skb->priority > cur_prio) {
430573d80debSLuiz Augusto von Dentz 				num = 0;
430673d80debSLuiz Augusto von Dentz 				min = ~0;
430773d80debSLuiz Augusto von Dentz 				cur_prio = skb->priority;
430873d80debSLuiz Augusto von Dentz 			}
430973d80debSLuiz Augusto von Dentz 
431073d80debSLuiz Augusto von Dentz 			num++;
431173d80debSLuiz Augusto von Dentz 
431273d80debSLuiz Augusto von Dentz 			if (conn->sent < min) {
431373d80debSLuiz Augusto von Dentz 				min  = conn->sent;
431473d80debSLuiz Augusto von Dentz 				chan = tmp;
431573d80debSLuiz Augusto von Dentz 			}
431673d80debSLuiz Augusto von Dentz 		}
431773d80debSLuiz Augusto von Dentz 
431873d80debSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == conn_num)
431973d80debSLuiz Augusto von Dentz 			break;
432073d80debSLuiz Augusto von Dentz 	}
432173d80debSLuiz Augusto von Dentz 
4322bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4323bf4c6325SGustavo F. Padovan 
432473d80debSLuiz Augusto von Dentz 	if (!chan)
432573d80debSLuiz Augusto von Dentz 		return NULL;
432673d80debSLuiz Augusto von Dentz 
432773d80debSLuiz Augusto von Dentz 	switch (chan->conn->type) {
432873d80debSLuiz Augusto von Dentz 	case ACL_LINK:
432973d80debSLuiz Augusto von Dentz 		cnt = hdev->acl_cnt;
433073d80debSLuiz Augusto von Dentz 		break;
4331bd1eb66bSAndrei Emeltchenko 	case AMP_LINK:
4332bd1eb66bSAndrei Emeltchenko 		cnt = hdev->block_cnt;
4333bd1eb66bSAndrei Emeltchenko 		break;
433473d80debSLuiz Augusto von Dentz 	case SCO_LINK:
433573d80debSLuiz Augusto von Dentz 	case ESCO_LINK:
433673d80debSLuiz Augusto von Dentz 		cnt = hdev->sco_cnt;
433773d80debSLuiz Augusto von Dentz 		break;
433873d80debSLuiz Augusto von Dentz 	case LE_LINK:
433973d80debSLuiz Augusto von Dentz 		cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
434073d80debSLuiz Augusto von Dentz 		break;
434173d80debSLuiz Augusto von Dentz 	default:
434273d80debSLuiz Augusto von Dentz 		cnt = 0;
43432064ee33SMarcel Holtmann 		bt_dev_err(hdev, "unknown link type %d", chan->conn->type);
434473d80debSLuiz Augusto von Dentz 	}
434573d80debSLuiz Augusto von Dentz 
434673d80debSLuiz Augusto von Dentz 	q = cnt / num;
434773d80debSLuiz Augusto von Dentz 	*quote = q ? q : 1;
434873d80debSLuiz Augusto von Dentz 	BT_DBG("chan %p quote %d", chan, *quote);
434973d80debSLuiz Augusto von Dentz 	return chan;
435073d80debSLuiz Augusto von Dentz }
435173d80debSLuiz Augusto von Dentz 
435202b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type)
435302b20f0bSLuiz Augusto von Dentz {
435402b20f0bSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
435502b20f0bSLuiz Augusto von Dentz 	struct hci_conn *conn;
435602b20f0bSLuiz Augusto von Dentz 	int num = 0;
435702b20f0bSLuiz Augusto von Dentz 
435802b20f0bSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
435902b20f0bSLuiz Augusto von Dentz 
4360bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4361bf4c6325SGustavo F. Padovan 
4362bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
436302b20f0bSLuiz Augusto von Dentz 		struct hci_chan *chan;
436402b20f0bSLuiz Augusto von Dentz 
436502b20f0bSLuiz Augusto von Dentz 		if (conn->type != type)
436602b20f0bSLuiz Augusto von Dentz 			continue;
436702b20f0bSLuiz Augusto von Dentz 
436802b20f0bSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
436902b20f0bSLuiz Augusto von Dentz 			continue;
437002b20f0bSLuiz Augusto von Dentz 
437102b20f0bSLuiz Augusto von Dentz 		num++;
437202b20f0bSLuiz Augusto von Dentz 
43738192edefSGustavo F. Padovan 		list_for_each_entry_rcu(chan, &conn->chan_list, list) {
437402b20f0bSLuiz Augusto von Dentz 			struct sk_buff *skb;
437502b20f0bSLuiz Augusto von Dentz 
437602b20f0bSLuiz Augusto von Dentz 			if (chan->sent) {
437702b20f0bSLuiz Augusto von Dentz 				chan->sent = 0;
437802b20f0bSLuiz Augusto von Dentz 				continue;
437902b20f0bSLuiz Augusto von Dentz 			}
438002b20f0bSLuiz Augusto von Dentz 
438102b20f0bSLuiz Augusto von Dentz 			if (skb_queue_empty(&chan->data_q))
438202b20f0bSLuiz Augusto von Dentz 				continue;
438302b20f0bSLuiz Augusto von Dentz 
438402b20f0bSLuiz Augusto von Dentz 			skb = skb_peek(&chan->data_q);
438502b20f0bSLuiz Augusto von Dentz 			if (skb->priority >= HCI_PRIO_MAX - 1)
438602b20f0bSLuiz Augusto von Dentz 				continue;
438702b20f0bSLuiz Augusto von Dentz 
438802b20f0bSLuiz Augusto von Dentz 			skb->priority = HCI_PRIO_MAX - 1;
438902b20f0bSLuiz Augusto von Dentz 
439002b20f0bSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p promoted to %d", chan, skb,
439102b20f0bSLuiz Augusto von Dentz 			       skb->priority);
439202b20f0bSLuiz Augusto von Dentz 		}
439302b20f0bSLuiz Augusto von Dentz 
439402b20f0bSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
439502b20f0bSLuiz Augusto von Dentz 			break;
439602b20f0bSLuiz Augusto von Dentz 	}
4397bf4c6325SGustavo F. Padovan 
4398bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4399bf4c6325SGustavo F. Padovan 
440002b20f0bSLuiz Augusto von Dentz }
440102b20f0bSLuiz Augusto von Dentz 
4402b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb)
4403b71d385aSAndrei Emeltchenko {
4404b71d385aSAndrei Emeltchenko 	/* Calculate count of blocks used by this packet */
4405b71d385aSAndrei Emeltchenko 	return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len);
4406b71d385aSAndrei Emeltchenko }
4407b71d385aSAndrei Emeltchenko 
44086039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt)
44091da177e4SLinus Torvalds {
4410d7a5a11dSMarcel Holtmann 	if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
44111da177e4SLinus Torvalds 		/* ACL tx timeout must be longer than maximum
44121da177e4SLinus Torvalds 		 * link supervision timeout (40.9 seconds) */
441363d2bc1bSAndrei Emeltchenko 		if (!cnt && time_after(jiffies, hdev->acl_last_tx +
44145f246e89SAndrei Emeltchenko 				       HCI_ACL_TX_TIMEOUT))
4415bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, ACL_LINK);
44161da177e4SLinus Torvalds 	}
441763d2bc1bSAndrei Emeltchenko }
44181da177e4SLinus Torvalds 
44197fedd3bbSAbhishek Pandit-Subedi /* Schedule SCO */
44207fedd3bbSAbhishek Pandit-Subedi static void hci_sched_sco(struct hci_dev *hdev)
44217fedd3bbSAbhishek Pandit-Subedi {
44227fedd3bbSAbhishek Pandit-Subedi 	struct hci_conn *conn;
44237fedd3bbSAbhishek Pandit-Subedi 	struct sk_buff *skb;
44247fedd3bbSAbhishek Pandit-Subedi 	int quote;
44257fedd3bbSAbhishek Pandit-Subedi 
44267fedd3bbSAbhishek Pandit-Subedi 	BT_DBG("%s", hdev->name);
44277fedd3bbSAbhishek Pandit-Subedi 
44287fedd3bbSAbhishek Pandit-Subedi 	if (!hci_conn_num(hdev, SCO_LINK))
44297fedd3bbSAbhishek Pandit-Subedi 		return;
44307fedd3bbSAbhishek Pandit-Subedi 
44317fedd3bbSAbhishek Pandit-Subedi 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, &quote))) {
44327fedd3bbSAbhishek Pandit-Subedi 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
44337fedd3bbSAbhishek Pandit-Subedi 			BT_DBG("skb %p len %d", skb, skb->len);
44347fedd3bbSAbhishek Pandit-Subedi 			hci_send_frame(hdev, skb);
44357fedd3bbSAbhishek Pandit-Subedi 
44367fedd3bbSAbhishek Pandit-Subedi 			conn->sent++;
44377fedd3bbSAbhishek Pandit-Subedi 			if (conn->sent == ~0)
44387fedd3bbSAbhishek Pandit-Subedi 				conn->sent = 0;
44397fedd3bbSAbhishek Pandit-Subedi 		}
44407fedd3bbSAbhishek Pandit-Subedi 	}
44417fedd3bbSAbhishek Pandit-Subedi }
44427fedd3bbSAbhishek Pandit-Subedi 
44437fedd3bbSAbhishek Pandit-Subedi static void hci_sched_esco(struct hci_dev *hdev)
44447fedd3bbSAbhishek Pandit-Subedi {
44457fedd3bbSAbhishek Pandit-Subedi 	struct hci_conn *conn;
44467fedd3bbSAbhishek Pandit-Subedi 	struct sk_buff *skb;
44477fedd3bbSAbhishek Pandit-Subedi 	int quote;
44487fedd3bbSAbhishek Pandit-Subedi 
44497fedd3bbSAbhishek Pandit-Subedi 	BT_DBG("%s", hdev->name);
44507fedd3bbSAbhishek Pandit-Subedi 
44517fedd3bbSAbhishek Pandit-Subedi 	if (!hci_conn_num(hdev, ESCO_LINK))
44527fedd3bbSAbhishek Pandit-Subedi 		return;
44537fedd3bbSAbhishek Pandit-Subedi 
44547fedd3bbSAbhishek Pandit-Subedi 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK,
44557fedd3bbSAbhishek Pandit-Subedi 						     &quote))) {
44567fedd3bbSAbhishek Pandit-Subedi 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
44577fedd3bbSAbhishek Pandit-Subedi 			BT_DBG("skb %p len %d", skb, skb->len);
44587fedd3bbSAbhishek Pandit-Subedi 			hci_send_frame(hdev, skb);
44597fedd3bbSAbhishek Pandit-Subedi 
44607fedd3bbSAbhishek Pandit-Subedi 			conn->sent++;
44617fedd3bbSAbhishek Pandit-Subedi 			if (conn->sent == ~0)
44627fedd3bbSAbhishek Pandit-Subedi 				conn->sent = 0;
44637fedd3bbSAbhishek Pandit-Subedi 		}
44647fedd3bbSAbhishek Pandit-Subedi 	}
44657fedd3bbSAbhishek Pandit-Subedi }
44667fedd3bbSAbhishek Pandit-Subedi 
44676039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev)
446863d2bc1bSAndrei Emeltchenko {
446963d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->acl_cnt;
447063d2bc1bSAndrei Emeltchenko 	struct hci_chan *chan;
447163d2bc1bSAndrei Emeltchenko 	struct sk_buff *skb;
447263d2bc1bSAndrei Emeltchenko 	int quote;
447363d2bc1bSAndrei Emeltchenko 
447463d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
447504837f64SMarcel Holtmann 
447673d80debSLuiz Augusto von Dentz 	while (hdev->acl_cnt &&
447773d80debSLuiz Augusto von Dentz 	       (chan = hci_chan_sent(hdev, ACL_LINK, &quote))) {
4478ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
4479ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
448073d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
448173d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
448273d80debSLuiz Augusto von Dentz 
4483ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
4484ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
4485ec1cce24SLuiz Augusto von Dentz 				break;
4486ec1cce24SLuiz Augusto von Dentz 
4487ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
4488ec1cce24SLuiz Augusto von Dentz 
448973d80debSLuiz Augusto von Dentz 			hci_conn_enter_active_mode(chan->conn,
449073d80debSLuiz Augusto von Dentz 						   bt_cb(skb)->force_active);
449104837f64SMarcel Holtmann 
449257d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
44931da177e4SLinus Torvalds 			hdev->acl_last_tx = jiffies;
44941da177e4SLinus Torvalds 
44951da177e4SLinus Torvalds 			hdev->acl_cnt--;
449673d80debSLuiz Augusto von Dentz 			chan->sent++;
449773d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
44987fedd3bbSAbhishek Pandit-Subedi 
44997fedd3bbSAbhishek Pandit-Subedi 			/* Send pending SCO packets right away */
45007fedd3bbSAbhishek Pandit-Subedi 			hci_sched_sco(hdev);
45017fedd3bbSAbhishek Pandit-Subedi 			hci_sched_esco(hdev);
45021da177e4SLinus Torvalds 		}
45031da177e4SLinus Torvalds 	}
450402b20f0bSLuiz Augusto von Dentz 
450502b20f0bSLuiz Augusto von Dentz 	if (cnt != hdev->acl_cnt)
450602b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, ACL_LINK);
45071da177e4SLinus Torvalds }
45081da177e4SLinus Torvalds 
45096039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev)
4510b71d385aSAndrei Emeltchenko {
451163d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->block_cnt;
4512b71d385aSAndrei Emeltchenko 	struct hci_chan *chan;
4513b71d385aSAndrei Emeltchenko 	struct sk_buff *skb;
4514b71d385aSAndrei Emeltchenko 	int quote;
4515bd1eb66bSAndrei Emeltchenko 	u8 type;
4516b71d385aSAndrei Emeltchenko 
451763d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
4518b71d385aSAndrei Emeltchenko 
4519bd1eb66bSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
4520bd1eb66bSAndrei Emeltchenko 
4521bd1eb66bSAndrei Emeltchenko 	if (hdev->dev_type == HCI_AMP)
4522bd1eb66bSAndrei Emeltchenko 		type = AMP_LINK;
4523bd1eb66bSAndrei Emeltchenko 	else
4524bd1eb66bSAndrei Emeltchenko 		type = ACL_LINK;
4525bd1eb66bSAndrei Emeltchenko 
4526b71d385aSAndrei Emeltchenko 	while (hdev->block_cnt > 0 &&
4527bd1eb66bSAndrei Emeltchenko 	       (chan = hci_chan_sent(hdev, type, &quote))) {
4528b71d385aSAndrei Emeltchenko 		u32 priority = (skb_peek(&chan->data_q))->priority;
4529b71d385aSAndrei Emeltchenko 		while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
4530b71d385aSAndrei Emeltchenko 			int blocks;
4531b71d385aSAndrei Emeltchenko 
4532b71d385aSAndrei Emeltchenko 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
4533b71d385aSAndrei Emeltchenko 			       skb->len, skb->priority);
4534b71d385aSAndrei Emeltchenko 
4535b71d385aSAndrei Emeltchenko 			/* Stop if priority has changed */
4536b71d385aSAndrei Emeltchenko 			if (skb->priority < priority)
4537b71d385aSAndrei Emeltchenko 				break;
4538b71d385aSAndrei Emeltchenko 
4539b71d385aSAndrei Emeltchenko 			skb = skb_dequeue(&chan->data_q);
4540b71d385aSAndrei Emeltchenko 
4541b71d385aSAndrei Emeltchenko 			blocks = __get_blocks(hdev, skb);
4542b71d385aSAndrei Emeltchenko 			if (blocks > hdev->block_cnt)
4543b71d385aSAndrei Emeltchenko 				return;
4544b71d385aSAndrei Emeltchenko 
4545b71d385aSAndrei Emeltchenko 			hci_conn_enter_active_mode(chan->conn,
4546b71d385aSAndrei Emeltchenko 						   bt_cb(skb)->force_active);
4547b71d385aSAndrei Emeltchenko 
454857d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
4549b71d385aSAndrei Emeltchenko 			hdev->acl_last_tx = jiffies;
4550b71d385aSAndrei Emeltchenko 
4551b71d385aSAndrei Emeltchenko 			hdev->block_cnt -= blocks;
4552b71d385aSAndrei Emeltchenko 			quote -= blocks;
4553b71d385aSAndrei Emeltchenko 
4554b71d385aSAndrei Emeltchenko 			chan->sent += blocks;
4555b71d385aSAndrei Emeltchenko 			chan->conn->sent += blocks;
4556b71d385aSAndrei Emeltchenko 		}
4557b71d385aSAndrei Emeltchenko 	}
4558b71d385aSAndrei Emeltchenko 
4559b71d385aSAndrei Emeltchenko 	if (cnt != hdev->block_cnt)
4560bd1eb66bSAndrei Emeltchenko 		hci_prio_recalculate(hdev, type);
4561b71d385aSAndrei Emeltchenko }
4562b71d385aSAndrei Emeltchenko 
45636039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev)
4564b71d385aSAndrei Emeltchenko {
4565b71d385aSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
4566b71d385aSAndrei Emeltchenko 
4567bd1eb66bSAndrei Emeltchenko 	/* No ACL link over BR/EDR controller */
4568ca8bee5dSMarcel Holtmann 	if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_PRIMARY)
4569bd1eb66bSAndrei Emeltchenko 		return;
4570bd1eb66bSAndrei Emeltchenko 
4571bd1eb66bSAndrei Emeltchenko 	/* No AMP link over AMP controller */
4572bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
4573b71d385aSAndrei Emeltchenko 		return;
4574b71d385aSAndrei Emeltchenko 
4575b71d385aSAndrei Emeltchenko 	switch (hdev->flow_ctl_mode) {
4576b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_PACKET_BASED:
4577b71d385aSAndrei Emeltchenko 		hci_sched_acl_pkt(hdev);
4578b71d385aSAndrei Emeltchenko 		break;
4579b71d385aSAndrei Emeltchenko 
4580b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_BLOCK_BASED:
4581b71d385aSAndrei Emeltchenko 		hci_sched_acl_blk(hdev);
4582b71d385aSAndrei Emeltchenko 		break;
4583b71d385aSAndrei Emeltchenko 	}
4584b71d385aSAndrei Emeltchenko }
4585b71d385aSAndrei Emeltchenko 
45866039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev)
45876ed58ec5SVille Tervo {
458873d80debSLuiz Augusto von Dentz 	struct hci_chan *chan;
45896ed58ec5SVille Tervo 	struct sk_buff *skb;
459002b20f0bSLuiz Augusto von Dentz 	int quote, cnt, tmp;
45916ed58ec5SVille Tervo 
45926ed58ec5SVille Tervo 	BT_DBG("%s", hdev->name);
45936ed58ec5SVille Tervo 
459452087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, LE_LINK))
459552087a79SLuiz Augusto von Dentz 		return;
459652087a79SLuiz Augusto von Dentz 
45976ed58ec5SVille Tervo 	cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
45981b1d29e5SLuiz Augusto von Dentz 
45991b1d29e5SLuiz Augusto von Dentz 	__check_timeout(hdev, cnt);
46001b1d29e5SLuiz Augusto von Dentz 
460102b20f0bSLuiz Augusto von Dentz 	tmp = cnt;
460273d80debSLuiz Augusto von Dentz 	while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, &quote))) {
4603ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
4604ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
460573d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
460673d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
46076ed58ec5SVille Tervo 
4608ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
4609ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
4610ec1cce24SLuiz Augusto von Dentz 				break;
4611ec1cce24SLuiz Augusto von Dentz 
4612ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
4613ec1cce24SLuiz Augusto von Dentz 
461457d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
46156ed58ec5SVille Tervo 			hdev->le_last_tx = jiffies;
46166ed58ec5SVille Tervo 
46176ed58ec5SVille Tervo 			cnt--;
461873d80debSLuiz Augusto von Dentz 			chan->sent++;
461973d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
46207fedd3bbSAbhishek Pandit-Subedi 
46217fedd3bbSAbhishek Pandit-Subedi 			/* Send pending SCO packets right away */
46227fedd3bbSAbhishek Pandit-Subedi 			hci_sched_sco(hdev);
46237fedd3bbSAbhishek Pandit-Subedi 			hci_sched_esco(hdev);
46246ed58ec5SVille Tervo 		}
46256ed58ec5SVille Tervo 	}
462673d80debSLuiz Augusto von Dentz 
46276ed58ec5SVille Tervo 	if (hdev->le_pkts)
46286ed58ec5SVille Tervo 		hdev->le_cnt = cnt;
46296ed58ec5SVille Tervo 	else
46306ed58ec5SVille Tervo 		hdev->acl_cnt = cnt;
463102b20f0bSLuiz Augusto von Dentz 
463202b20f0bSLuiz Augusto von Dentz 	if (cnt != tmp)
463302b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, LE_LINK);
46346ed58ec5SVille Tervo }
46356ed58ec5SVille Tervo 
46363eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work)
46371da177e4SLinus Torvalds {
46383eff45eaSGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work);
46391da177e4SLinus Torvalds 	struct sk_buff *skb;
46401da177e4SLinus Torvalds 
46416ed58ec5SVille Tervo 	BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt,
46426ed58ec5SVille Tervo 	       hdev->sco_cnt, hdev->le_cnt);
46431da177e4SLinus Torvalds 
4644d7a5a11dSMarcel Holtmann 	if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
46451da177e4SLinus Torvalds 		/* Schedule queues and send stuff to HCI driver */
46461da177e4SLinus Torvalds 		hci_sched_sco(hdev);
4647b6a0dc82SMarcel Holtmann 		hci_sched_esco(hdev);
46487fedd3bbSAbhishek Pandit-Subedi 		hci_sched_acl(hdev);
46496ed58ec5SVille Tervo 		hci_sched_le(hdev);
465052de599eSMarcel Holtmann 	}
46516ed58ec5SVille Tervo 
46521da177e4SLinus Torvalds 	/* Send next queued raw (unknown type) packet */
46531da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->raw_q)))
465457d17d70SMarcel Holtmann 		hci_send_frame(hdev, skb);
46551da177e4SLinus Torvalds }
46561da177e4SLinus Torvalds 
465725985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */
46581da177e4SLinus Torvalds 
46591da177e4SLinus Torvalds /* ACL data packet */
46606039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
46611da177e4SLinus Torvalds {
46621da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr = (void *) skb->data;
46631da177e4SLinus Torvalds 	struct hci_conn *conn;
46641da177e4SLinus Torvalds 	__u16 handle, flags;
46651da177e4SLinus Torvalds 
46661da177e4SLinus Torvalds 	skb_pull(skb, HCI_ACL_HDR_SIZE);
46671da177e4SLinus Torvalds 
46681da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
46691da177e4SLinus Torvalds 	flags  = hci_flags(handle);
46701da177e4SLinus Torvalds 	handle = hci_handle(handle);
46711da177e4SLinus Torvalds 
4672f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
4673a8c5fb1aSGustavo Padovan 	       handle, flags);
46741da177e4SLinus Torvalds 
46751da177e4SLinus Torvalds 	hdev->stat.acl_rx++;
46761da177e4SLinus Torvalds 
46771da177e4SLinus Torvalds 	hci_dev_lock(hdev);
46781da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
46791da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
46801da177e4SLinus Torvalds 
46811da177e4SLinus Torvalds 	if (conn) {
468265983fc7SMat Martineau 		hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
468304837f64SMarcel Holtmann 
46841da177e4SLinus Torvalds 		/* Send to upper protocol */
4685686ebf28SUlisses Furquim 		l2cap_recv_acldata(conn, skb, flags);
46861da177e4SLinus Torvalds 		return;
46871da177e4SLinus Torvalds 	} else {
46882064ee33SMarcel Holtmann 		bt_dev_err(hdev, "ACL packet for unknown connection handle %d",
46892064ee33SMarcel Holtmann 			   handle);
46901da177e4SLinus Torvalds 	}
46911da177e4SLinus Torvalds 
46921da177e4SLinus Torvalds 	kfree_skb(skb);
46931da177e4SLinus Torvalds }
46941da177e4SLinus Torvalds 
46951da177e4SLinus Torvalds /* SCO data packet */
46966039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
46971da177e4SLinus Torvalds {
46981da177e4SLinus Torvalds 	struct hci_sco_hdr *hdr = (void *) skb->data;
46991da177e4SLinus Torvalds 	struct hci_conn *conn;
4700debdedf2SMarcel Holtmann 	__u16 handle, flags;
47011da177e4SLinus Torvalds 
47021da177e4SLinus Torvalds 	skb_pull(skb, HCI_SCO_HDR_SIZE);
47031da177e4SLinus Torvalds 
47041da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
4705debdedf2SMarcel Holtmann 	flags  = hci_flags(handle);
4706debdedf2SMarcel Holtmann 	handle = hci_handle(handle);
47071da177e4SLinus Torvalds 
4708debdedf2SMarcel Holtmann 	BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
4709debdedf2SMarcel Holtmann 	       handle, flags);
47101da177e4SLinus Torvalds 
47111da177e4SLinus Torvalds 	hdev->stat.sco_rx++;
47121da177e4SLinus Torvalds 
47131da177e4SLinus Torvalds 	hci_dev_lock(hdev);
47141da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
47151da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
47161da177e4SLinus Torvalds 
47171da177e4SLinus Torvalds 	if (conn) {
47181da177e4SLinus Torvalds 		/* Send to upper protocol */
471900398e1dSAlain Michaud 		bt_cb(skb)->sco.pkt_status = flags & 0x03;
4720686ebf28SUlisses Furquim 		sco_recv_scodata(conn, skb);
47211da177e4SLinus Torvalds 		return;
47221da177e4SLinus Torvalds 	} else {
47232064ee33SMarcel Holtmann 		bt_dev_err(hdev, "SCO packet for unknown connection handle %d",
47242064ee33SMarcel Holtmann 			   handle);
47251da177e4SLinus Torvalds 	}
47261da177e4SLinus Torvalds 
47271da177e4SLinus Torvalds 	kfree_skb(skb);
47281da177e4SLinus Torvalds }
47291da177e4SLinus Torvalds 
47309238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev)
47319238f36aSJohan Hedberg {
47329238f36aSJohan Hedberg 	struct sk_buff *skb;
47339238f36aSJohan Hedberg 
47349238f36aSJohan Hedberg 	skb = skb_peek(&hdev->cmd_q);
47359238f36aSJohan Hedberg 	if (!skb)
47369238f36aSJohan Hedberg 		return true;
47379238f36aSJohan Hedberg 
473844d27137SJohan Hedberg 	return (bt_cb(skb)->hci.req_flags & HCI_REQ_START);
47399238f36aSJohan Hedberg }
47409238f36aSJohan Hedberg 
474142c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev)
474242c6b129SJohan Hedberg {
474342c6b129SJohan Hedberg 	struct hci_command_hdr *sent;
474442c6b129SJohan Hedberg 	struct sk_buff *skb;
474542c6b129SJohan Hedberg 	u16 opcode;
474642c6b129SJohan Hedberg 
474742c6b129SJohan Hedberg 	if (!hdev->sent_cmd)
474842c6b129SJohan Hedberg 		return;
474942c6b129SJohan Hedberg 
475042c6b129SJohan Hedberg 	sent = (void *) hdev->sent_cmd->data;
475142c6b129SJohan Hedberg 	opcode = __le16_to_cpu(sent->opcode);
475242c6b129SJohan Hedberg 	if (opcode == HCI_OP_RESET)
475342c6b129SJohan Hedberg 		return;
475442c6b129SJohan Hedberg 
475542c6b129SJohan Hedberg 	skb = skb_clone(hdev->sent_cmd, GFP_KERNEL);
475642c6b129SJohan Hedberg 	if (!skb)
475742c6b129SJohan Hedberg 		return;
475842c6b129SJohan Hedberg 
475942c6b129SJohan Hedberg 	skb_queue_head(&hdev->cmd_q, skb);
476042c6b129SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
476142c6b129SJohan Hedberg }
476242c6b129SJohan Hedberg 
4763e6214487SJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status,
4764e6214487SJohan Hedberg 			  hci_req_complete_t *req_complete,
4765e6214487SJohan Hedberg 			  hci_req_complete_skb_t *req_complete_skb)
47669238f36aSJohan Hedberg {
47679238f36aSJohan Hedberg 	struct sk_buff *skb;
47689238f36aSJohan Hedberg 	unsigned long flags;
47699238f36aSJohan Hedberg 
47709238f36aSJohan Hedberg 	BT_DBG("opcode 0x%04x status 0x%02x", opcode, status);
47719238f36aSJohan Hedberg 
477242c6b129SJohan Hedberg 	/* If the completed command doesn't match the last one that was
477342c6b129SJohan Hedberg 	 * sent we need to do special handling of it.
47749238f36aSJohan Hedberg 	 */
477542c6b129SJohan Hedberg 	if (!hci_sent_cmd_data(hdev, opcode)) {
477642c6b129SJohan Hedberg 		/* Some CSR based controllers generate a spontaneous
477742c6b129SJohan Hedberg 		 * reset complete event during init and any pending
477842c6b129SJohan Hedberg 		 * command will never be completed. In such a case we
477942c6b129SJohan Hedberg 		 * need to resend whatever was the last sent
478042c6b129SJohan Hedberg 		 * command.
478142c6b129SJohan Hedberg 		 */
478242c6b129SJohan Hedberg 		if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET)
478342c6b129SJohan Hedberg 			hci_resend_last(hdev);
478442c6b129SJohan Hedberg 
47859238f36aSJohan Hedberg 		return;
478642c6b129SJohan Hedberg 	}
47879238f36aSJohan Hedberg 
4788f80c5dadSJoão Paulo Rechi Vita 	/* If we reach this point this event matches the last command sent */
4789f80c5dadSJoão Paulo Rechi Vita 	hci_dev_clear_flag(hdev, HCI_CMD_PENDING);
4790f80c5dadSJoão Paulo Rechi Vita 
47919238f36aSJohan Hedberg 	/* If the command succeeded and there's still more commands in
47929238f36aSJohan Hedberg 	 * this request the request is not yet complete.
47939238f36aSJohan Hedberg 	 */
47949238f36aSJohan Hedberg 	if (!status && !hci_req_is_complete(hdev))
47959238f36aSJohan Hedberg 		return;
47969238f36aSJohan Hedberg 
47979238f36aSJohan Hedberg 	/* If this was the last command in a request the complete
47989238f36aSJohan Hedberg 	 * callback would be found in hdev->sent_cmd instead of the
47999238f36aSJohan Hedberg 	 * command queue (hdev->cmd_q).
48009238f36aSJohan Hedberg 	 */
480144d27137SJohan Hedberg 	if (bt_cb(hdev->sent_cmd)->hci.req_flags & HCI_REQ_SKB) {
480244d27137SJohan Hedberg 		*req_complete_skb = bt_cb(hdev->sent_cmd)->hci.req_complete_skb;
4803e6214487SJohan Hedberg 		return;
48049238f36aSJohan Hedberg 	}
4805e6214487SJohan Hedberg 
480644d27137SJohan Hedberg 	if (bt_cb(hdev->sent_cmd)->hci.req_complete) {
480744d27137SJohan Hedberg 		*req_complete = bt_cb(hdev->sent_cmd)->hci.req_complete;
4808e6214487SJohan Hedberg 		return;
480953e21fbcSJohan Hedberg 	}
48109238f36aSJohan Hedberg 
48119238f36aSJohan Hedberg 	/* Remove all pending commands belonging to this request */
48129238f36aSJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
48139238f36aSJohan Hedberg 	while ((skb = __skb_dequeue(&hdev->cmd_q))) {
481444d27137SJohan Hedberg 		if (bt_cb(skb)->hci.req_flags & HCI_REQ_START) {
48159238f36aSJohan Hedberg 			__skb_queue_head(&hdev->cmd_q, skb);
48169238f36aSJohan Hedberg 			break;
48179238f36aSJohan Hedberg 		}
48189238f36aSJohan Hedberg 
48193bd7594eSDouglas Anderson 		if (bt_cb(skb)->hci.req_flags & HCI_REQ_SKB)
4820242c0ebdSMarcel Holtmann 			*req_complete_skb = bt_cb(skb)->hci.req_complete_skb;
48213bd7594eSDouglas Anderson 		else
48223bd7594eSDouglas Anderson 			*req_complete = bt_cb(skb)->hci.req_complete;
48239238f36aSJohan Hedberg 		kfree_skb(skb);
48249238f36aSJohan Hedberg 	}
48259238f36aSJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
48269238f36aSJohan Hedberg }
48279238f36aSJohan Hedberg 
4828b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work)
48291da177e4SLinus Torvalds {
4830b78752ccSMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work);
48311da177e4SLinus Torvalds 	struct sk_buff *skb;
48321da177e4SLinus Torvalds 
48331da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
48341da177e4SLinus Torvalds 
48351da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->rx_q))) {
4836cd82e61cSMarcel Holtmann 		/* Send copy to monitor */
4837cd82e61cSMarcel Holtmann 		hci_send_to_monitor(hdev, skb);
4838cd82e61cSMarcel Holtmann 
48391da177e4SLinus Torvalds 		if (atomic_read(&hdev->promisc)) {
48401da177e4SLinus Torvalds 			/* Send copy to the sockets */
4841470fe1b5SMarcel Holtmann 			hci_send_to_sock(hdev, skb);
48421da177e4SLinus Torvalds 		}
48431da177e4SLinus Torvalds 
4844eb8c101eSMattijs Korpershoek 		/* If the device has been opened in HCI_USER_CHANNEL,
4845eb8c101eSMattijs Korpershoek 		 * the userspace has exclusive access to device.
4846eb8c101eSMattijs Korpershoek 		 * When device is HCI_INIT, we still need to process
4847eb8c101eSMattijs Korpershoek 		 * the data packets to the driver in order
4848eb8c101eSMattijs Korpershoek 		 * to complete its setup().
4849eb8c101eSMattijs Korpershoek 		 */
4850eb8c101eSMattijs Korpershoek 		if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
4851eb8c101eSMattijs Korpershoek 		    !test_bit(HCI_INIT, &hdev->flags)) {
48521da177e4SLinus Torvalds 			kfree_skb(skb);
48531da177e4SLinus Torvalds 			continue;
48541da177e4SLinus Torvalds 		}
48551da177e4SLinus Torvalds 
48561da177e4SLinus Torvalds 		if (test_bit(HCI_INIT, &hdev->flags)) {
48571da177e4SLinus Torvalds 			/* Don't process data packets in this states. */
4858d79f34e3SMarcel Holtmann 			switch (hci_skb_pkt_type(skb)) {
48591da177e4SLinus Torvalds 			case HCI_ACLDATA_PKT:
48601da177e4SLinus Torvalds 			case HCI_SCODATA_PKT:
4861cc974003SMarcel Holtmann 			case HCI_ISODATA_PKT:
48621da177e4SLinus Torvalds 				kfree_skb(skb);
48631da177e4SLinus Torvalds 				continue;
48643ff50b79SStephen Hemminger 			}
48651da177e4SLinus Torvalds 		}
48661da177e4SLinus Torvalds 
48671da177e4SLinus Torvalds 		/* Process frame */
4868d79f34e3SMarcel Holtmann 		switch (hci_skb_pkt_type(skb)) {
48691da177e4SLinus Torvalds 		case HCI_EVENT_PKT:
4870b78752ccSMarcel Holtmann 			BT_DBG("%s Event packet", hdev->name);
48711da177e4SLinus Torvalds 			hci_event_packet(hdev, skb);
48721da177e4SLinus Torvalds 			break;
48731da177e4SLinus Torvalds 
48741da177e4SLinus Torvalds 		case HCI_ACLDATA_PKT:
48751da177e4SLinus Torvalds 			BT_DBG("%s ACL data packet", hdev->name);
48761da177e4SLinus Torvalds 			hci_acldata_packet(hdev, skb);
48771da177e4SLinus Torvalds 			break;
48781da177e4SLinus Torvalds 
48791da177e4SLinus Torvalds 		case HCI_SCODATA_PKT:
48801da177e4SLinus Torvalds 			BT_DBG("%s SCO data packet", hdev->name);
48811da177e4SLinus Torvalds 			hci_scodata_packet(hdev, skb);
48821da177e4SLinus Torvalds 			break;
48831da177e4SLinus Torvalds 
48841da177e4SLinus Torvalds 		default:
48851da177e4SLinus Torvalds 			kfree_skb(skb);
48861da177e4SLinus Torvalds 			break;
48871da177e4SLinus Torvalds 		}
48881da177e4SLinus Torvalds 	}
48891da177e4SLinus Torvalds }
48901da177e4SLinus Torvalds 
4891c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work)
48921da177e4SLinus Torvalds {
4893c347b765SGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work);
48941da177e4SLinus Torvalds 	struct sk_buff *skb;
48951da177e4SLinus Torvalds 
48962104786bSAndrei Emeltchenko 	BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name,
48972104786bSAndrei Emeltchenko 	       atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q));
48981da177e4SLinus Torvalds 
48991da177e4SLinus Torvalds 	/* Send queued commands */
49005a08ecceSAndrei Emeltchenko 	if (atomic_read(&hdev->cmd_cnt)) {
49015a08ecceSAndrei Emeltchenko 		skb = skb_dequeue(&hdev->cmd_q);
49025a08ecceSAndrei Emeltchenko 		if (!skb)
49035a08ecceSAndrei Emeltchenko 			return;
49045a08ecceSAndrei Emeltchenko 
49051da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
49061da177e4SLinus Torvalds 
4907a675d7f1SMarcel Holtmann 		hdev->sent_cmd = skb_clone(skb, GFP_KERNEL);
490870f23020SAndrei Emeltchenko 		if (hdev->sent_cmd) {
4909f80c5dadSJoão Paulo Rechi Vita 			if (hci_req_status_pend(hdev))
4910f80c5dadSJoão Paulo Rechi Vita 				hci_dev_set_flag(hdev, HCI_CMD_PENDING);
49111da177e4SLinus Torvalds 			atomic_dec(&hdev->cmd_cnt);
491257d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
49137bdb8a5cSSzymon Janc 			if (test_bit(HCI_RESET, &hdev->flags))
491465cc2b49SMarcel Holtmann 				cancel_delayed_work(&hdev->cmd_timer);
49157bdb8a5cSSzymon Janc 			else
491665cc2b49SMarcel Holtmann 				schedule_delayed_work(&hdev->cmd_timer,
491765cc2b49SMarcel Holtmann 						      HCI_CMD_TIMEOUT);
49181da177e4SLinus Torvalds 		} else {
49191da177e4SLinus Torvalds 			skb_queue_head(&hdev->cmd_q, skb);
4920c347b765SGustavo F. Padovan 			queue_work(hdev->workqueue, &hdev->cmd_work);
49211da177e4SLinus Torvalds 		}
49221da177e4SLinus Torvalds 	}
49231da177e4SLinus Torvalds }
4924