11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds BlueZ - Bluetooth protocol stack for Linux 31da177e4SLinus Torvalds Copyright (C) 2000-2001 Qualcomm Incorporated 4590051deSGustavo F. Padovan Copyright (C) 2011 ProFUSION Embedded Systems 51da177e4SLinus Torvalds 61da177e4SLinus Torvalds Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds This program is free software; you can redistribute it and/or modify 91da177e4SLinus Torvalds it under the terms of the GNU General Public License version 2 as 101da177e4SLinus Torvalds published by the Free Software Foundation; 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 131da177e4SLinus Torvalds OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 141da177e4SLinus Torvalds FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 151da177e4SLinus Torvalds IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY 161da177e4SLinus Torvalds CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 171da177e4SLinus Torvalds WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 181da177e4SLinus Torvalds ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 191da177e4SLinus Torvalds OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 221da177e4SLinus Torvalds COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 231da177e4SLinus Torvalds SOFTWARE IS DISCLAIMED. 241da177e4SLinus Torvalds */ 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds /* Bluetooth HCI core. */ 271da177e4SLinus Torvalds 288c520a59SGustavo Padovan #include <linux/export.h> 293df92b31SSasha Levin #include <linux/idr.h> 30611b30f7SMarcel Holtmann #include <linux/rfkill.h> 31baf27f6eSMarcel Holtmann #include <linux/debugfs.h> 3299780a7bSJohan Hedberg #include <linux/crypto.h> 3347219839SMarcel Holtmann #include <asm/unaligned.h> 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds #include <net/bluetooth/bluetooth.h> 361da177e4SLinus Torvalds #include <net/bluetooth/hci_core.h> 374bc58f51SJohan Hedberg #include <net/bluetooth/l2cap.h> 38af58925cSMarcel Holtmann #include <net/bluetooth/mgmt.h> 391da177e4SLinus Torvalds 400857dd3bSJohan Hedberg #include "hci_request.h" 4160c5f5fbSMarcel Holtmann #include "hci_debugfs.h" 42970c4e46SJohan Hedberg #include "smp.h" 43970c4e46SJohan Hedberg 44b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work); 45c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work); 463eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work); 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds /* HCI device list */ 491da177e4SLinus Torvalds LIST_HEAD(hci_dev_list); 501da177e4SLinus Torvalds DEFINE_RWLOCK(hci_dev_list_lock); 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds /* HCI callback list */ 531da177e4SLinus Torvalds LIST_HEAD(hci_cb_list); 54fba7ecf0SJohan Hedberg DEFINE_MUTEX(hci_cb_list_lock); 551da177e4SLinus Torvalds 563df92b31SSasha Levin /* HCI ID Numbering */ 573df92b31SSasha Levin static DEFINE_IDA(hci_index_ida); 583df92b31SSasha Levin 59899de765SMarcel Holtmann /* ----- HCI requests ----- */ 60899de765SMarcel Holtmann 61899de765SMarcel Holtmann #define HCI_REQ_DONE 0 62899de765SMarcel Holtmann #define HCI_REQ_PEND 1 63899de765SMarcel Holtmann #define HCI_REQ_CANCELED 2 64899de765SMarcel Holtmann 65899de765SMarcel Holtmann #define hci_req_lock(d) mutex_lock(&d->req_lock) 66899de765SMarcel Holtmann #define hci_req_unlock(d) mutex_unlock(&d->req_lock) 67899de765SMarcel Holtmann 681da177e4SLinus Torvalds /* ---- HCI notifications ---- */ 691da177e4SLinus Torvalds 706516455dSMarcel Holtmann static void hci_notify(struct hci_dev *hdev, int event) 711da177e4SLinus Torvalds { 72040030efSMarcel Holtmann hci_sock_dev_event(hdev, event); 731da177e4SLinus Torvalds } 741da177e4SLinus Torvalds 75baf27f6eSMarcel Holtmann /* ---- HCI debugfs entries ---- */ 76baf27f6eSMarcel Holtmann 774b4148e9SMarcel Holtmann static ssize_t dut_mode_read(struct file *file, char __user *user_buf, 784b4148e9SMarcel Holtmann size_t count, loff_t *ppos) 794b4148e9SMarcel Holtmann { 804b4148e9SMarcel Holtmann struct hci_dev *hdev = file->private_data; 814b4148e9SMarcel Holtmann char buf[3]; 824b4148e9SMarcel Holtmann 83b7cb93e5SMarcel Holtmann buf[0] = hci_dev_test_flag(hdev, HCI_DUT_MODE) ? 'Y': 'N'; 844b4148e9SMarcel Holtmann buf[1] = '\n'; 854b4148e9SMarcel Holtmann buf[2] = '\0'; 864b4148e9SMarcel Holtmann return simple_read_from_buffer(user_buf, count, ppos, buf, 2); 874b4148e9SMarcel Holtmann } 884b4148e9SMarcel Holtmann 894b4148e9SMarcel Holtmann static ssize_t dut_mode_write(struct file *file, const char __user *user_buf, 904b4148e9SMarcel Holtmann size_t count, loff_t *ppos) 914b4148e9SMarcel Holtmann { 924b4148e9SMarcel Holtmann struct hci_dev *hdev = file->private_data; 934b4148e9SMarcel Holtmann struct sk_buff *skb; 944b4148e9SMarcel Holtmann char buf[32]; 954b4148e9SMarcel Holtmann size_t buf_size = min(count, (sizeof(buf)-1)); 964b4148e9SMarcel Holtmann bool enable; 974b4148e9SMarcel Holtmann 984b4148e9SMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) 994b4148e9SMarcel Holtmann return -ENETDOWN; 1004b4148e9SMarcel Holtmann 1014b4148e9SMarcel Holtmann if (copy_from_user(buf, user_buf, buf_size)) 1024b4148e9SMarcel Holtmann return -EFAULT; 1034b4148e9SMarcel Holtmann 1044b4148e9SMarcel Holtmann buf[buf_size] = '\0'; 1054b4148e9SMarcel Holtmann if (strtobool(buf, &enable)) 1064b4148e9SMarcel Holtmann return -EINVAL; 1074b4148e9SMarcel Holtmann 108b7cb93e5SMarcel Holtmann if (enable == hci_dev_test_flag(hdev, HCI_DUT_MODE)) 1094b4148e9SMarcel Holtmann return -EALREADY; 1104b4148e9SMarcel Holtmann 1114b4148e9SMarcel Holtmann hci_req_lock(hdev); 1124b4148e9SMarcel Holtmann if (enable) 1134b4148e9SMarcel Holtmann skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL, 1144b4148e9SMarcel Holtmann HCI_CMD_TIMEOUT); 1154b4148e9SMarcel Holtmann else 1164b4148e9SMarcel Holtmann skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, 1174b4148e9SMarcel Holtmann HCI_CMD_TIMEOUT); 1184b4148e9SMarcel Holtmann hci_req_unlock(hdev); 1194b4148e9SMarcel Holtmann 1204b4148e9SMarcel Holtmann if (IS_ERR(skb)) 1214b4148e9SMarcel Holtmann return PTR_ERR(skb); 1224b4148e9SMarcel Holtmann 1234b4148e9SMarcel Holtmann kfree_skb(skb); 1244b4148e9SMarcel Holtmann 125b7cb93e5SMarcel Holtmann hci_dev_change_flag(hdev, HCI_DUT_MODE); 1264b4148e9SMarcel Holtmann 1274b4148e9SMarcel Holtmann return count; 1284b4148e9SMarcel Holtmann } 1294b4148e9SMarcel Holtmann 1304b4148e9SMarcel Holtmann static const struct file_operations dut_mode_fops = { 1314b4148e9SMarcel Holtmann .open = simple_open, 1324b4148e9SMarcel Holtmann .read = dut_mode_read, 1334b4148e9SMarcel Holtmann .write = dut_mode_write, 1344b4148e9SMarcel Holtmann .llseek = default_llseek, 1354b4148e9SMarcel Holtmann }; 1364b4148e9SMarcel Holtmann 1374b4113d6SMarcel Holtmann static ssize_t vendor_diag_read(struct file *file, char __user *user_buf, 1384b4113d6SMarcel Holtmann size_t count, loff_t *ppos) 1394b4113d6SMarcel Holtmann { 1404b4113d6SMarcel Holtmann struct hci_dev *hdev = file->private_data; 1414b4113d6SMarcel Holtmann char buf[3]; 1424b4113d6SMarcel Holtmann 1434b4113d6SMarcel Holtmann buf[0] = hci_dev_test_flag(hdev, HCI_VENDOR_DIAG) ? 'Y': 'N'; 1444b4113d6SMarcel Holtmann buf[1] = '\n'; 1454b4113d6SMarcel Holtmann buf[2] = '\0'; 1464b4113d6SMarcel Holtmann return simple_read_from_buffer(user_buf, count, ppos, buf, 2); 1474b4113d6SMarcel Holtmann } 1484b4113d6SMarcel Holtmann 1494b4113d6SMarcel Holtmann static ssize_t vendor_diag_write(struct file *file, const char __user *user_buf, 1504b4113d6SMarcel Holtmann size_t count, loff_t *ppos) 1514b4113d6SMarcel Holtmann { 1524b4113d6SMarcel Holtmann struct hci_dev *hdev = file->private_data; 1534b4113d6SMarcel Holtmann char buf[32]; 1544b4113d6SMarcel Holtmann size_t buf_size = min(count, (sizeof(buf)-1)); 1554b4113d6SMarcel Holtmann bool enable; 1564b4113d6SMarcel Holtmann int err; 1574b4113d6SMarcel Holtmann 1584b4113d6SMarcel Holtmann if (copy_from_user(buf, user_buf, buf_size)) 1594b4113d6SMarcel Holtmann return -EFAULT; 1604b4113d6SMarcel Holtmann 1614b4113d6SMarcel Holtmann buf[buf_size] = '\0'; 1624b4113d6SMarcel Holtmann if (strtobool(buf, &enable)) 1634b4113d6SMarcel Holtmann return -EINVAL; 1644b4113d6SMarcel Holtmann 1654b4113d6SMarcel Holtmann hci_req_lock(hdev); 1664b4113d6SMarcel Holtmann err = hdev->set_diag(hdev, enable); 1674b4113d6SMarcel Holtmann hci_req_unlock(hdev); 1684b4113d6SMarcel Holtmann 1694b4113d6SMarcel Holtmann if (err < 0) 1704b4113d6SMarcel Holtmann return err; 1714b4113d6SMarcel Holtmann 1724b4113d6SMarcel Holtmann if (enable) 1734b4113d6SMarcel Holtmann hci_dev_set_flag(hdev, HCI_VENDOR_DIAG); 1744b4113d6SMarcel Holtmann else 1754b4113d6SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_VENDOR_DIAG); 1764b4113d6SMarcel Holtmann 1774b4113d6SMarcel Holtmann return count; 1784b4113d6SMarcel Holtmann } 1794b4113d6SMarcel Holtmann 1804b4113d6SMarcel Holtmann static const struct file_operations vendor_diag_fops = { 1814b4113d6SMarcel Holtmann .open = simple_open, 1824b4113d6SMarcel Holtmann .read = vendor_diag_read, 1834b4113d6SMarcel Holtmann .write = vendor_diag_write, 1844b4113d6SMarcel Holtmann .llseek = default_llseek, 1854b4113d6SMarcel Holtmann }; 1864b4113d6SMarcel Holtmann 1871da177e4SLinus Torvalds /* ---- HCI requests ---- */ 1881da177e4SLinus Torvalds 189f60cb305SJohan Hedberg static void hci_req_sync_complete(struct hci_dev *hdev, u8 result, u16 opcode, 190f60cb305SJohan Hedberg struct sk_buff *skb) 1911da177e4SLinus Torvalds { 19242c6b129SJohan Hedberg BT_DBG("%s result 0x%2.2x", hdev->name, result); 19375fb0e32SJohan Hedberg 1941da177e4SLinus Torvalds if (hdev->req_status == HCI_REQ_PEND) { 1951da177e4SLinus Torvalds hdev->req_result = result; 1961da177e4SLinus Torvalds hdev->req_status = HCI_REQ_DONE; 197f60cb305SJohan Hedberg if (skb) 198f60cb305SJohan Hedberg hdev->req_skb = skb_get(skb); 1991da177e4SLinus Torvalds wake_up_interruptible(&hdev->req_wait_q); 2001da177e4SLinus Torvalds } 2011da177e4SLinus Torvalds } 2021da177e4SLinus Torvalds 2031da177e4SLinus Torvalds static void hci_req_cancel(struct hci_dev *hdev, int err) 2041da177e4SLinus Torvalds { 2051da177e4SLinus Torvalds BT_DBG("%s err 0x%2.2x", hdev->name, err); 2061da177e4SLinus Torvalds 2071da177e4SLinus Torvalds if (hdev->req_status == HCI_REQ_PEND) { 2081da177e4SLinus Torvalds hdev->req_result = err; 2091da177e4SLinus Torvalds hdev->req_status = HCI_REQ_CANCELED; 2101da177e4SLinus Torvalds wake_up_interruptible(&hdev->req_wait_q); 2111da177e4SLinus Torvalds } 2121da177e4SLinus Torvalds } 2131da177e4SLinus Torvalds 2147b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, 21507dc93ddSJohan Hedberg const void *param, u8 event, u32 timeout) 21675e84b7cSJohan Hedberg { 21775e84b7cSJohan Hedberg DECLARE_WAITQUEUE(wait, current); 21875e84b7cSJohan Hedberg struct hci_request req; 219f60cb305SJohan Hedberg struct sk_buff *skb; 22075e84b7cSJohan Hedberg int err = 0; 22175e84b7cSJohan Hedberg 22275e84b7cSJohan Hedberg BT_DBG("%s", hdev->name); 22375e84b7cSJohan Hedberg 22475e84b7cSJohan Hedberg hci_req_init(&req, hdev); 22575e84b7cSJohan Hedberg 2267b1abbbeSJohan Hedberg hci_req_add_ev(&req, opcode, plen, param, event); 22775e84b7cSJohan Hedberg 22875e84b7cSJohan Hedberg hdev->req_status = HCI_REQ_PEND; 22975e84b7cSJohan Hedberg 23075e84b7cSJohan Hedberg add_wait_queue(&hdev->req_wait_q, &wait); 23175e84b7cSJohan Hedberg set_current_state(TASK_INTERRUPTIBLE); 23275e84b7cSJohan Hedberg 233f60cb305SJohan Hedberg err = hci_req_run_skb(&req, hci_req_sync_complete); 234039fada5SChan-yeol Park if (err < 0) { 235039fada5SChan-yeol Park remove_wait_queue(&hdev->req_wait_q, &wait); 23622a3ceabSJohan Hedberg set_current_state(TASK_RUNNING); 237039fada5SChan-yeol Park return ERR_PTR(err); 238039fada5SChan-yeol Park } 239039fada5SChan-yeol Park 24075e84b7cSJohan Hedberg schedule_timeout(timeout); 24175e84b7cSJohan Hedberg 24275e84b7cSJohan Hedberg remove_wait_queue(&hdev->req_wait_q, &wait); 24375e84b7cSJohan Hedberg 24475e84b7cSJohan Hedberg if (signal_pending(current)) 24575e84b7cSJohan Hedberg return ERR_PTR(-EINTR); 24675e84b7cSJohan Hedberg 24775e84b7cSJohan Hedberg switch (hdev->req_status) { 24875e84b7cSJohan Hedberg case HCI_REQ_DONE: 24975e84b7cSJohan Hedberg err = -bt_to_errno(hdev->req_result); 25075e84b7cSJohan Hedberg break; 25175e84b7cSJohan Hedberg 25275e84b7cSJohan Hedberg case HCI_REQ_CANCELED: 25375e84b7cSJohan Hedberg err = -hdev->req_result; 25475e84b7cSJohan Hedberg break; 25575e84b7cSJohan Hedberg 25675e84b7cSJohan Hedberg default: 25775e84b7cSJohan Hedberg err = -ETIMEDOUT; 25875e84b7cSJohan Hedberg break; 25975e84b7cSJohan Hedberg } 26075e84b7cSJohan Hedberg 26175e84b7cSJohan Hedberg hdev->req_status = hdev->req_result = 0; 262f60cb305SJohan Hedberg skb = hdev->req_skb; 263f60cb305SJohan Hedberg hdev->req_skb = NULL; 26475e84b7cSJohan Hedberg 26575e84b7cSJohan Hedberg BT_DBG("%s end: err %d", hdev->name, err); 26675e84b7cSJohan Hedberg 267f60cb305SJohan Hedberg if (err < 0) { 268f60cb305SJohan Hedberg kfree_skb(skb); 26975e84b7cSJohan Hedberg return ERR_PTR(err); 270f60cb305SJohan Hedberg } 27175e84b7cSJohan Hedberg 272757aa0b5SJohan Hedberg if (!skb) 273757aa0b5SJohan Hedberg return ERR_PTR(-ENODATA); 274757aa0b5SJohan Hedberg 275757aa0b5SJohan Hedberg return skb; 2767b1abbbeSJohan Hedberg } 2777b1abbbeSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync_ev); 2787b1abbbeSJohan Hedberg 2797b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, 28007dc93ddSJohan Hedberg const void *param, u32 timeout) 2817b1abbbeSJohan Hedberg { 2827b1abbbeSJohan Hedberg return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout); 28375e84b7cSJohan Hedberg } 28475e84b7cSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync); 28575e84b7cSJohan Hedberg 2861da177e4SLinus Torvalds /* Execute request and wait for completion. */ 28701178cd4SJohan Hedberg static int __hci_req_sync(struct hci_dev *hdev, 28842c6b129SJohan Hedberg void (*func)(struct hci_request *req, 28942c6b129SJohan Hedberg unsigned long opt), 2901da177e4SLinus Torvalds unsigned long opt, __u32 timeout) 2911da177e4SLinus Torvalds { 29242c6b129SJohan Hedberg struct hci_request req; 2931da177e4SLinus Torvalds DECLARE_WAITQUEUE(wait, current); 2941da177e4SLinus Torvalds int err = 0; 2951da177e4SLinus Torvalds 2961da177e4SLinus Torvalds BT_DBG("%s start", hdev->name); 2971da177e4SLinus Torvalds 29842c6b129SJohan Hedberg hci_req_init(&req, hdev); 29942c6b129SJohan Hedberg 3001da177e4SLinus Torvalds hdev->req_status = HCI_REQ_PEND; 3011da177e4SLinus Torvalds 30242c6b129SJohan Hedberg func(&req, opt); 30353cce22dSJohan Hedberg 304039fada5SChan-yeol Park add_wait_queue(&hdev->req_wait_q, &wait); 305039fada5SChan-yeol Park set_current_state(TASK_INTERRUPTIBLE); 306039fada5SChan-yeol Park 307f60cb305SJohan Hedberg err = hci_req_run_skb(&req, hci_req_sync_complete); 30842c6b129SJohan Hedberg if (err < 0) { 30953cce22dSJohan Hedberg hdev->req_status = 0; 310920c8300SAndre Guedes 311039fada5SChan-yeol Park remove_wait_queue(&hdev->req_wait_q, &wait); 31222a3ceabSJohan Hedberg set_current_state(TASK_RUNNING); 313039fada5SChan-yeol Park 314920c8300SAndre Guedes /* ENODATA means the HCI request command queue is empty. 315920c8300SAndre Guedes * This can happen when a request with conditionals doesn't 316920c8300SAndre Guedes * trigger any commands to be sent. This is normal behavior 317920c8300SAndre Guedes * and should not trigger an error return. 31842c6b129SJohan Hedberg */ 319920c8300SAndre Guedes if (err == -ENODATA) 32042c6b129SJohan Hedberg return 0; 321920c8300SAndre Guedes 322920c8300SAndre Guedes return err; 32353cce22dSJohan Hedberg } 32453cce22dSJohan Hedberg 3251da177e4SLinus Torvalds schedule_timeout(timeout); 3261da177e4SLinus Torvalds 3271da177e4SLinus Torvalds remove_wait_queue(&hdev->req_wait_q, &wait); 3281da177e4SLinus Torvalds 3291da177e4SLinus Torvalds if (signal_pending(current)) 3301da177e4SLinus Torvalds return -EINTR; 3311da177e4SLinus Torvalds 3321da177e4SLinus Torvalds switch (hdev->req_status) { 3331da177e4SLinus Torvalds case HCI_REQ_DONE: 334e175072fSJoe Perches err = -bt_to_errno(hdev->req_result); 3351da177e4SLinus Torvalds break; 3361da177e4SLinus Torvalds 3371da177e4SLinus Torvalds case HCI_REQ_CANCELED: 3381da177e4SLinus Torvalds err = -hdev->req_result; 3391da177e4SLinus Torvalds break; 3401da177e4SLinus Torvalds 3411da177e4SLinus Torvalds default: 3421da177e4SLinus Torvalds err = -ETIMEDOUT; 3431da177e4SLinus Torvalds break; 3443ff50b79SStephen Hemminger } 3451da177e4SLinus Torvalds 346a5040efaSJohan Hedberg hdev->req_status = hdev->req_result = 0; 3471da177e4SLinus Torvalds 3481da177e4SLinus Torvalds BT_DBG("%s end: err %d", hdev->name, err); 3491da177e4SLinus Torvalds 3501da177e4SLinus Torvalds return err; 3511da177e4SLinus Torvalds } 3521da177e4SLinus Torvalds 35301178cd4SJohan Hedberg static int hci_req_sync(struct hci_dev *hdev, 35442c6b129SJohan Hedberg void (*req)(struct hci_request *req, 35542c6b129SJohan Hedberg unsigned long opt), 3561da177e4SLinus Torvalds unsigned long opt, __u32 timeout) 3571da177e4SLinus Torvalds { 3581da177e4SLinus Torvalds int ret; 3591da177e4SLinus Torvalds 3607c6a329eSMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) 3617c6a329eSMarcel Holtmann return -ENETDOWN; 3627c6a329eSMarcel Holtmann 3631da177e4SLinus Torvalds /* Serialize all requests */ 3641da177e4SLinus Torvalds hci_req_lock(hdev); 36501178cd4SJohan Hedberg ret = __hci_req_sync(hdev, req, opt, timeout); 3661da177e4SLinus Torvalds hci_req_unlock(hdev); 3671da177e4SLinus Torvalds 3681da177e4SLinus Torvalds return ret; 3691da177e4SLinus Torvalds } 3701da177e4SLinus Torvalds 37142c6b129SJohan Hedberg static void hci_reset_req(struct hci_request *req, unsigned long opt) 3721da177e4SLinus Torvalds { 37342c6b129SJohan Hedberg BT_DBG("%s %ld", req->hdev->name, opt); 3741da177e4SLinus Torvalds 3751da177e4SLinus Torvalds /* Reset device */ 37642c6b129SJohan Hedberg set_bit(HCI_RESET, &req->hdev->flags); 37742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_RESET, 0, NULL); 3781da177e4SLinus Torvalds } 3791da177e4SLinus Torvalds 38042c6b129SJohan Hedberg static void bredr_init(struct hci_request *req) 3811da177e4SLinus Torvalds { 38242c6b129SJohan Hedberg req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED; 3832455a3eaSAndrei Emeltchenko 3841da177e4SLinus Torvalds /* Read Local Supported Features */ 38542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); 3861da177e4SLinus Torvalds 3871143e5a6SMarcel Holtmann /* Read Local Version */ 38842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 3892177bab5SJohan Hedberg 3902177bab5SJohan Hedberg /* Read BD Address */ 39142c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL); 3921da177e4SLinus Torvalds } 3931da177e4SLinus Torvalds 3940af801b9SJohan Hedberg static void amp_init1(struct hci_request *req) 395e61ef499SAndrei Emeltchenko { 39642c6b129SJohan Hedberg req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED; 3972455a3eaSAndrei Emeltchenko 398e61ef499SAndrei Emeltchenko /* Read Local Version */ 39942c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 4006bcbc489SAndrei Emeltchenko 401f6996cfeSMarcel Holtmann /* Read Local Supported Commands */ 402f6996cfeSMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); 403f6996cfeSMarcel Holtmann 4046bcbc489SAndrei Emeltchenko /* Read Local AMP Info */ 40542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL); 406e71dfabaSAndrei Emeltchenko 407e71dfabaSAndrei Emeltchenko /* Read Data Blk size */ 40842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL); 4097528ca1cSMarcel Holtmann 410f38ba941SMarcel Holtmann /* Read Flow Control Mode */ 411f38ba941SMarcel Holtmann hci_req_add(req, HCI_OP_READ_FLOW_CONTROL_MODE, 0, NULL); 412f38ba941SMarcel Holtmann 4137528ca1cSMarcel Holtmann /* Read Location Data */ 4147528ca1cSMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCATION_DATA, 0, NULL); 415e61ef499SAndrei Emeltchenko } 416e61ef499SAndrei Emeltchenko 4170af801b9SJohan Hedberg static void amp_init2(struct hci_request *req) 4180af801b9SJohan Hedberg { 4190af801b9SJohan Hedberg /* Read Local Supported Features. Not all AMP controllers 4200af801b9SJohan Hedberg * support this so it's placed conditionally in the second 4210af801b9SJohan Hedberg * stage init. 4220af801b9SJohan Hedberg */ 4230af801b9SJohan Hedberg if (req->hdev->commands[14] & 0x20) 4240af801b9SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); 4250af801b9SJohan Hedberg } 4260af801b9SJohan Hedberg 42742c6b129SJohan Hedberg static void hci_init1_req(struct hci_request *req, unsigned long opt) 428e61ef499SAndrei Emeltchenko { 42942c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 430e61ef499SAndrei Emeltchenko 431e61ef499SAndrei Emeltchenko BT_DBG("%s %ld", hdev->name, opt); 432e61ef499SAndrei Emeltchenko 43311778716SAndrei Emeltchenko /* Reset */ 43411778716SAndrei Emeltchenko if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) 43542c6b129SJohan Hedberg hci_reset_req(req, 0); 43611778716SAndrei Emeltchenko 437e61ef499SAndrei Emeltchenko switch (hdev->dev_type) { 438e61ef499SAndrei Emeltchenko case HCI_BREDR: 43942c6b129SJohan Hedberg bredr_init(req); 440e61ef499SAndrei Emeltchenko break; 441e61ef499SAndrei Emeltchenko 442e61ef499SAndrei Emeltchenko case HCI_AMP: 4430af801b9SJohan Hedberg amp_init1(req); 444e61ef499SAndrei Emeltchenko break; 445e61ef499SAndrei Emeltchenko 446e61ef499SAndrei Emeltchenko default: 447e61ef499SAndrei Emeltchenko BT_ERR("Unknown device type %d", hdev->dev_type); 448e61ef499SAndrei Emeltchenko break; 449e61ef499SAndrei Emeltchenko } 450e61ef499SAndrei Emeltchenko } 451e61ef499SAndrei Emeltchenko 45242c6b129SJohan Hedberg static void bredr_setup(struct hci_request *req) 4532177bab5SJohan Hedberg { 4542177bab5SJohan Hedberg __le16 param; 4552177bab5SJohan Hedberg __u8 flt_type; 4562177bab5SJohan Hedberg 4572177bab5SJohan Hedberg /* Read Buffer Size (ACL mtu, max pkt, etc.) */ 45842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL); 4592177bab5SJohan Hedberg 4602177bab5SJohan Hedberg /* Read Class of Device */ 46142c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL); 4622177bab5SJohan Hedberg 4632177bab5SJohan Hedberg /* Read Local Name */ 46442c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL); 4652177bab5SJohan Hedberg 4662177bab5SJohan Hedberg /* Read Voice Setting */ 46742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL); 4682177bab5SJohan Hedberg 469b4cb9fb2SMarcel Holtmann /* Read Number of Supported IAC */ 470b4cb9fb2SMarcel Holtmann hci_req_add(req, HCI_OP_READ_NUM_SUPPORTED_IAC, 0, NULL); 471b4cb9fb2SMarcel Holtmann 4724b836f39SMarcel Holtmann /* Read Current IAC LAP */ 4734b836f39SMarcel Holtmann hci_req_add(req, HCI_OP_READ_CURRENT_IAC_LAP, 0, NULL); 4744b836f39SMarcel Holtmann 4752177bab5SJohan Hedberg /* Clear Event Filters */ 4762177bab5SJohan Hedberg flt_type = HCI_FLT_CLEAR_ALL; 47742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type); 4782177bab5SJohan Hedberg 4792177bab5SJohan Hedberg /* Connection accept timeout ~20 secs */ 480dcf4adbfSJoe Perches param = cpu_to_le16(0x7d00); 48142c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); 4822177bab5SJohan Hedberg } 4832177bab5SJohan Hedberg 48442c6b129SJohan Hedberg static void le_setup(struct hci_request *req) 4852177bab5SJohan Hedberg { 486c73eee91SJohan Hedberg struct hci_dev *hdev = req->hdev; 487c73eee91SJohan Hedberg 4882177bab5SJohan Hedberg /* Read LE Buffer Size */ 48942c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL); 4902177bab5SJohan Hedberg 4912177bab5SJohan Hedberg /* Read LE Local Supported Features */ 49242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL); 4932177bab5SJohan Hedberg 494747d3f03SMarcel Holtmann /* Read LE Supported States */ 495747d3f03SMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL); 496747d3f03SMarcel Holtmann 4972177bab5SJohan Hedberg /* Read LE White List Size */ 49842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL); 4992177bab5SJohan Hedberg 500747d3f03SMarcel Holtmann /* Clear LE White List */ 501747d3f03SMarcel Holtmann hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL); 502c73eee91SJohan Hedberg 503c73eee91SJohan Hedberg /* LE-only controllers have LE implicitly enabled */ 504c73eee91SJohan Hedberg if (!lmp_bredr_capable(hdev)) 505a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_LE_ENABLED); 5062177bab5SJohan Hedberg } 5072177bab5SJohan Hedberg 50842c6b129SJohan Hedberg static void hci_setup_event_mask(struct hci_request *req) 5092177bab5SJohan Hedberg { 51042c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 51142c6b129SJohan Hedberg 5122177bab5SJohan Hedberg /* The second byte is 0xff instead of 0x9f (two reserved bits 5132177bab5SJohan Hedberg * disabled) since a Broadcom 1.2 dongle doesn't respond to the 5142177bab5SJohan Hedberg * command otherwise. 5152177bab5SJohan Hedberg */ 5162177bab5SJohan Hedberg u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 }; 5172177bab5SJohan Hedberg 5182177bab5SJohan Hedberg /* CSR 1.1 dongles does not accept any bitfield so don't try to set 5192177bab5SJohan Hedberg * any event mask for pre 1.2 devices. 5202177bab5SJohan Hedberg */ 5212177bab5SJohan Hedberg if (hdev->hci_ver < BLUETOOTH_VER_1_2) 5222177bab5SJohan Hedberg return; 5232177bab5SJohan Hedberg 5242177bab5SJohan Hedberg if (lmp_bredr_capable(hdev)) { 5252177bab5SJohan Hedberg events[4] |= 0x01; /* Flow Specification Complete */ 5262177bab5SJohan Hedberg events[4] |= 0x02; /* Inquiry Result with RSSI */ 5272177bab5SJohan Hedberg events[4] |= 0x04; /* Read Remote Extended Features Complete */ 5282177bab5SJohan Hedberg events[5] |= 0x08; /* Synchronous Connection Complete */ 5292177bab5SJohan Hedberg events[5] |= 0x10; /* Synchronous Connection Changed */ 530c7882cbdSMarcel Holtmann } else { 531c7882cbdSMarcel Holtmann /* Use a different default for LE-only devices */ 532c7882cbdSMarcel Holtmann memset(events, 0, sizeof(events)); 533c7882cbdSMarcel Holtmann events[0] |= 0x10; /* Disconnection Complete */ 534c7882cbdSMarcel Holtmann events[1] |= 0x08; /* Read Remote Version Information Complete */ 535c7882cbdSMarcel Holtmann events[1] |= 0x20; /* Command Complete */ 536c7882cbdSMarcel Holtmann events[1] |= 0x40; /* Command Status */ 537c7882cbdSMarcel Holtmann events[1] |= 0x80; /* Hardware Error */ 538c7882cbdSMarcel Holtmann events[2] |= 0x04; /* Number of Completed Packets */ 539c7882cbdSMarcel Holtmann events[3] |= 0x02; /* Data Buffer Overflow */ 5400da71f1bSMarcel Holtmann 5410da71f1bSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_ENCRYPTION) { 5420da71f1bSMarcel Holtmann events[0] |= 0x80; /* Encryption Change */ 543c7882cbdSMarcel Holtmann events[5] |= 0x80; /* Encryption Key Refresh Complete */ 5442177bab5SJohan Hedberg } 5450da71f1bSMarcel Holtmann } 5462177bab5SJohan Hedberg 5472177bab5SJohan Hedberg if (lmp_inq_rssi_capable(hdev)) 5482177bab5SJohan Hedberg events[4] |= 0x02; /* Inquiry Result with RSSI */ 5492177bab5SJohan Hedberg 5502177bab5SJohan Hedberg if (lmp_sniffsubr_capable(hdev)) 5512177bab5SJohan Hedberg events[5] |= 0x20; /* Sniff Subrating */ 5522177bab5SJohan Hedberg 5532177bab5SJohan Hedberg if (lmp_pause_enc_capable(hdev)) 5542177bab5SJohan Hedberg events[5] |= 0x80; /* Encryption Key Refresh Complete */ 5552177bab5SJohan Hedberg 5562177bab5SJohan Hedberg if (lmp_ext_inq_capable(hdev)) 5572177bab5SJohan Hedberg events[5] |= 0x40; /* Extended Inquiry Result */ 5582177bab5SJohan Hedberg 5592177bab5SJohan Hedberg if (lmp_no_flush_capable(hdev)) 5602177bab5SJohan Hedberg events[7] |= 0x01; /* Enhanced Flush Complete */ 5612177bab5SJohan Hedberg 5622177bab5SJohan Hedberg if (lmp_lsto_capable(hdev)) 5632177bab5SJohan Hedberg events[6] |= 0x80; /* Link Supervision Timeout Changed */ 5642177bab5SJohan Hedberg 5652177bab5SJohan Hedberg if (lmp_ssp_capable(hdev)) { 5662177bab5SJohan Hedberg events[6] |= 0x01; /* IO Capability Request */ 5672177bab5SJohan Hedberg events[6] |= 0x02; /* IO Capability Response */ 5682177bab5SJohan Hedberg events[6] |= 0x04; /* User Confirmation Request */ 5692177bab5SJohan Hedberg events[6] |= 0x08; /* User Passkey Request */ 5702177bab5SJohan Hedberg events[6] |= 0x10; /* Remote OOB Data Request */ 5712177bab5SJohan Hedberg events[6] |= 0x20; /* Simple Pairing Complete */ 5722177bab5SJohan Hedberg events[7] |= 0x04; /* User Passkey Notification */ 5732177bab5SJohan Hedberg events[7] |= 0x08; /* Keypress Notification */ 5742177bab5SJohan Hedberg events[7] |= 0x10; /* Remote Host Supported 5752177bab5SJohan Hedberg * Features Notification 5762177bab5SJohan Hedberg */ 5772177bab5SJohan Hedberg } 5782177bab5SJohan Hedberg 5792177bab5SJohan Hedberg if (lmp_le_capable(hdev)) 5802177bab5SJohan Hedberg events[7] |= 0x20; /* LE Meta-Event */ 5812177bab5SJohan Hedberg 58242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events); 5832177bab5SJohan Hedberg } 5842177bab5SJohan Hedberg 58542c6b129SJohan Hedberg static void hci_init2_req(struct hci_request *req, unsigned long opt) 5862177bab5SJohan Hedberg { 58742c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 58842c6b129SJohan Hedberg 5890af801b9SJohan Hedberg if (hdev->dev_type == HCI_AMP) 5900af801b9SJohan Hedberg return amp_init2(req); 5910af801b9SJohan Hedberg 5922177bab5SJohan Hedberg if (lmp_bredr_capable(hdev)) 59342c6b129SJohan Hedberg bredr_setup(req); 59456f87901SJohan Hedberg else 595a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); 5962177bab5SJohan Hedberg 5972177bab5SJohan Hedberg if (lmp_le_capable(hdev)) 59842c6b129SJohan Hedberg le_setup(req); 5992177bab5SJohan Hedberg 6000f3adeaeSMarcel Holtmann /* All Bluetooth 1.2 and later controllers should support the 6010f3adeaeSMarcel Holtmann * HCI command for reading the local supported commands. 6020f3adeaeSMarcel Holtmann * 6030f3adeaeSMarcel Holtmann * Unfortunately some controllers indicate Bluetooth 1.2 support, 6040f3adeaeSMarcel Holtmann * but do not have support for this command. If that is the case, 6050f3adeaeSMarcel Holtmann * the driver can quirk the behavior and skip reading the local 6060f3adeaeSMarcel Holtmann * supported commands. 6073f8e2d75SJohan Hedberg */ 6080f3adeaeSMarcel Holtmann if (hdev->hci_ver > BLUETOOTH_VER_1_1 && 6090f3adeaeSMarcel Holtmann !test_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks)) 61042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); 6112177bab5SJohan Hedberg 6122177bab5SJohan Hedberg if (lmp_ssp_capable(hdev)) { 61357af75a8SMarcel Holtmann /* When SSP is available, then the host features page 61457af75a8SMarcel Holtmann * should also be available as well. However some 61557af75a8SMarcel Holtmann * controllers list the max_page as 0 as long as SSP 61657af75a8SMarcel Holtmann * has not been enabled. To achieve proper debugging 61757af75a8SMarcel Holtmann * output, force the minimum max_page to 1 at least. 61857af75a8SMarcel Holtmann */ 61957af75a8SMarcel Holtmann hdev->max_page = 0x01; 62057af75a8SMarcel Holtmann 621d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { 6222177bab5SJohan Hedberg u8 mode = 0x01; 623574ea3c7SMarcel Holtmann 62442c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_SSP_MODE, 6252177bab5SJohan Hedberg sizeof(mode), &mode); 6262177bab5SJohan Hedberg } else { 6272177bab5SJohan Hedberg struct hci_cp_write_eir cp; 6282177bab5SJohan Hedberg 6292177bab5SJohan Hedberg memset(hdev->eir, 0, sizeof(hdev->eir)); 6302177bab5SJohan Hedberg memset(&cp, 0, sizeof(cp)); 6312177bab5SJohan Hedberg 63242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp); 6332177bab5SJohan Hedberg } 6342177bab5SJohan Hedberg } 6352177bab5SJohan Hedberg 636043ec9bfSMarcel Holtmann if (lmp_inq_rssi_capable(hdev) || 637043ec9bfSMarcel Holtmann test_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks)) { 63804422da9SMarcel Holtmann u8 mode; 63904422da9SMarcel Holtmann 64004422da9SMarcel Holtmann /* If Extended Inquiry Result events are supported, then 64104422da9SMarcel Holtmann * they are clearly preferred over Inquiry Result with RSSI 64204422da9SMarcel Holtmann * events. 64304422da9SMarcel Holtmann */ 64404422da9SMarcel Holtmann mode = lmp_ext_inq_capable(hdev) ? 0x02 : 0x01; 64504422da9SMarcel Holtmann 64604422da9SMarcel Holtmann hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode); 64704422da9SMarcel Holtmann } 6482177bab5SJohan Hedberg 6492177bab5SJohan Hedberg if (lmp_inq_tx_pwr_capable(hdev)) 65042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL); 6512177bab5SJohan Hedberg 6522177bab5SJohan Hedberg if (lmp_ext_feat_capable(hdev)) { 6532177bab5SJohan Hedberg struct hci_cp_read_local_ext_features cp; 6542177bab5SJohan Hedberg 6552177bab5SJohan Hedberg cp.page = 0x01; 65642c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES, 65742c6b129SJohan Hedberg sizeof(cp), &cp); 6582177bab5SJohan Hedberg } 6592177bab5SJohan Hedberg 660d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { 6612177bab5SJohan Hedberg u8 enable = 1; 66242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable), 6632177bab5SJohan Hedberg &enable); 6642177bab5SJohan Hedberg } 6652177bab5SJohan Hedberg } 6662177bab5SJohan Hedberg 66742c6b129SJohan Hedberg static void hci_setup_link_policy(struct hci_request *req) 6682177bab5SJohan Hedberg { 66942c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 6702177bab5SJohan Hedberg struct hci_cp_write_def_link_policy cp; 6712177bab5SJohan Hedberg u16 link_policy = 0; 6722177bab5SJohan Hedberg 6732177bab5SJohan Hedberg if (lmp_rswitch_capable(hdev)) 6742177bab5SJohan Hedberg link_policy |= HCI_LP_RSWITCH; 6752177bab5SJohan Hedberg if (lmp_hold_capable(hdev)) 6762177bab5SJohan Hedberg link_policy |= HCI_LP_HOLD; 6772177bab5SJohan Hedberg if (lmp_sniff_capable(hdev)) 6782177bab5SJohan Hedberg link_policy |= HCI_LP_SNIFF; 6792177bab5SJohan Hedberg if (lmp_park_capable(hdev)) 6802177bab5SJohan Hedberg link_policy |= HCI_LP_PARK; 6812177bab5SJohan Hedberg 6822177bab5SJohan Hedberg cp.policy = cpu_to_le16(link_policy); 68342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp); 6842177bab5SJohan Hedberg } 6852177bab5SJohan Hedberg 68642c6b129SJohan Hedberg static void hci_set_le_support(struct hci_request *req) 6872177bab5SJohan Hedberg { 68842c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 6892177bab5SJohan Hedberg struct hci_cp_write_le_host_supported cp; 6902177bab5SJohan Hedberg 691c73eee91SJohan Hedberg /* LE-only devices do not support explicit enablement */ 692c73eee91SJohan Hedberg if (!lmp_bredr_capable(hdev)) 693c73eee91SJohan Hedberg return; 694c73eee91SJohan Hedberg 6952177bab5SJohan Hedberg memset(&cp, 0, sizeof(cp)); 6962177bab5SJohan Hedberg 697d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { 6982177bab5SJohan Hedberg cp.le = 0x01; 69932226e4fSMarcel Holtmann cp.simul = 0x00; 7002177bab5SJohan Hedberg } 7012177bab5SJohan Hedberg 7022177bab5SJohan Hedberg if (cp.le != lmp_host_le_capable(hdev)) 70342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp), 7042177bab5SJohan Hedberg &cp); 7052177bab5SJohan Hedberg } 7062177bab5SJohan Hedberg 707d62e6d67SJohan Hedberg static void hci_set_event_mask_page_2(struct hci_request *req) 708d62e6d67SJohan Hedberg { 709d62e6d67SJohan Hedberg struct hci_dev *hdev = req->hdev; 710d62e6d67SJohan Hedberg u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 711d62e6d67SJohan Hedberg 712d62e6d67SJohan Hedberg /* If Connectionless Slave Broadcast master role is supported 713d62e6d67SJohan Hedberg * enable all necessary events for it. 714d62e6d67SJohan Hedberg */ 71553b834d2SMarcel Holtmann if (lmp_csb_master_capable(hdev)) { 716d62e6d67SJohan Hedberg events[1] |= 0x40; /* Triggered Clock Capture */ 717d62e6d67SJohan Hedberg events[1] |= 0x80; /* Synchronization Train Complete */ 718d62e6d67SJohan Hedberg events[2] |= 0x10; /* Slave Page Response Timeout */ 719d62e6d67SJohan Hedberg events[2] |= 0x20; /* CSB Channel Map Change */ 720d62e6d67SJohan Hedberg } 721d62e6d67SJohan Hedberg 722d62e6d67SJohan Hedberg /* If Connectionless Slave Broadcast slave role is supported 723d62e6d67SJohan Hedberg * enable all necessary events for it. 724d62e6d67SJohan Hedberg */ 72553b834d2SMarcel Holtmann if (lmp_csb_slave_capable(hdev)) { 726d62e6d67SJohan Hedberg events[2] |= 0x01; /* Synchronization Train Received */ 727d62e6d67SJohan Hedberg events[2] |= 0x02; /* CSB Receive */ 728d62e6d67SJohan Hedberg events[2] |= 0x04; /* CSB Timeout */ 729d62e6d67SJohan Hedberg events[2] |= 0x08; /* Truncated Page Complete */ 730d62e6d67SJohan Hedberg } 731d62e6d67SJohan Hedberg 73240c59fcbSMarcel Holtmann /* Enable Authenticated Payload Timeout Expired event if supported */ 733cd7ca0ecSMarcel Holtmann if (lmp_ping_capable(hdev) || hdev->le_features[0] & HCI_LE_PING) 73440c59fcbSMarcel Holtmann events[2] |= 0x80; 73540c59fcbSMarcel Holtmann 736d62e6d67SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2, sizeof(events), events); 737d62e6d67SJohan Hedberg } 738d62e6d67SJohan Hedberg 73942c6b129SJohan Hedberg static void hci_init3_req(struct hci_request *req, unsigned long opt) 7402177bab5SJohan Hedberg { 74142c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 742d2c5d77fSJohan Hedberg u8 p; 74342c6b129SJohan Hedberg 7440da71f1bSMarcel Holtmann hci_setup_event_mask(req); 7450da71f1bSMarcel Holtmann 746e81be90bSJohan Hedberg if (hdev->commands[6] & 0x20 && 747e81be90bSJohan Hedberg !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) { 74848ce62c4SMarcel Holtmann struct hci_cp_read_stored_link_key cp; 74948ce62c4SMarcel Holtmann 75048ce62c4SMarcel Holtmann bacpy(&cp.bdaddr, BDADDR_ANY); 75148ce62c4SMarcel Holtmann cp.read_all = 0x01; 75248ce62c4SMarcel Holtmann hci_req_add(req, HCI_OP_READ_STORED_LINK_KEY, sizeof(cp), &cp); 75348ce62c4SMarcel Holtmann } 75448ce62c4SMarcel Holtmann 7552177bab5SJohan Hedberg if (hdev->commands[5] & 0x10) 75642c6b129SJohan Hedberg hci_setup_link_policy(req); 7572177bab5SJohan Hedberg 758417287deSMarcel Holtmann if (hdev->commands[8] & 0x01) 759417287deSMarcel Holtmann hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL); 760417287deSMarcel Holtmann 761417287deSMarcel Holtmann /* Some older Broadcom based Bluetooth 1.2 controllers do not 762417287deSMarcel Holtmann * support the Read Page Scan Type command. Check support for 763417287deSMarcel Holtmann * this command in the bit mask of supported commands. 764417287deSMarcel Holtmann */ 765417287deSMarcel Holtmann if (hdev->commands[13] & 0x01) 766417287deSMarcel Holtmann hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL); 767417287deSMarcel Holtmann 7689193c6e8SAndre Guedes if (lmp_le_capable(hdev)) { 7699193c6e8SAndre Guedes u8 events[8]; 7709193c6e8SAndre Guedes 7719193c6e8SAndre Guedes memset(events, 0, sizeof(events)); 7724d6c705bSMarcel Holtmann events[0] = 0x0f; 7734d6c705bSMarcel Holtmann 7744d6c705bSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_ENCRYPTION) 7754d6c705bSMarcel Holtmann events[0] |= 0x10; /* LE Long Term Key Request */ 776662bc2e6SAndre Guedes 777662bc2e6SAndre Guedes /* If controller supports the Connection Parameters Request 778662bc2e6SAndre Guedes * Link Layer Procedure, enable the corresponding event. 779662bc2e6SAndre Guedes */ 780662bc2e6SAndre Guedes if (hdev->le_features[0] & HCI_LE_CONN_PARAM_REQ_PROC) 781662bc2e6SAndre Guedes events[0] |= 0x20; /* LE Remote Connection 782662bc2e6SAndre Guedes * Parameter Request 783662bc2e6SAndre Guedes */ 784662bc2e6SAndre Guedes 785a9f6068eSMarcel Holtmann /* If the controller supports the Data Length Extension 786a9f6068eSMarcel Holtmann * feature, enable the corresponding event. 787a9f6068eSMarcel Holtmann */ 788a9f6068eSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) 789a9f6068eSMarcel Holtmann events[0] |= 0x40; /* LE Data Length Change */ 790a9f6068eSMarcel Holtmann 7914b71bba4SMarcel Holtmann /* If the controller supports Extended Scanner Filter 7924b71bba4SMarcel Holtmann * Policies, enable the correspondig event. 7934b71bba4SMarcel Holtmann */ 7944b71bba4SMarcel Holtmann if (hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY) 7954b71bba4SMarcel Holtmann events[1] |= 0x04; /* LE Direct Advertising 7964b71bba4SMarcel Holtmann * Report 7974b71bba4SMarcel Holtmann */ 7984b71bba4SMarcel Holtmann 7995a34bd5fSMarcel Holtmann /* If the controller supports the LE Read Local P-256 8005a34bd5fSMarcel Holtmann * Public Key command, enable the corresponding event. 8015a34bd5fSMarcel Holtmann */ 8025a34bd5fSMarcel Holtmann if (hdev->commands[34] & 0x02) 8035a34bd5fSMarcel Holtmann events[0] |= 0x80; /* LE Read Local P-256 8045a34bd5fSMarcel Holtmann * Public Key Complete 8055a34bd5fSMarcel Holtmann */ 8065a34bd5fSMarcel Holtmann 8075a34bd5fSMarcel Holtmann /* If the controller supports the LE Generate DHKey 8085a34bd5fSMarcel Holtmann * command, enable the corresponding event. 8095a34bd5fSMarcel Holtmann */ 8105a34bd5fSMarcel Holtmann if (hdev->commands[34] & 0x04) 8115a34bd5fSMarcel Holtmann events[1] |= 0x01; /* LE Generate DHKey Complete */ 8125a34bd5fSMarcel Holtmann 8139193c6e8SAndre Guedes hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events), 8149193c6e8SAndre Guedes events); 8159193c6e8SAndre Guedes 81615a49ccaSMarcel Holtmann if (hdev->commands[25] & 0x40) { 81715a49ccaSMarcel Holtmann /* Read LE Advertising Channel TX Power */ 81815a49ccaSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL); 81915a49ccaSMarcel Holtmann } 82015a49ccaSMarcel Holtmann 821a9f6068eSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) { 822a9f6068eSMarcel Holtmann /* Read LE Maximum Data Length */ 823a9f6068eSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_MAX_DATA_LEN, 0, NULL); 824a9f6068eSMarcel Holtmann 825a9f6068eSMarcel Holtmann /* Read LE Suggested Default Data Length */ 826a9f6068eSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_DEF_DATA_LEN, 0, NULL); 827a9f6068eSMarcel Holtmann } 828a9f6068eSMarcel Holtmann 82942c6b129SJohan Hedberg hci_set_le_support(req); 8309193c6e8SAndre Guedes } 831d2c5d77fSJohan Hedberg 832d2c5d77fSJohan Hedberg /* Read features beyond page 1 if available */ 833d2c5d77fSJohan Hedberg for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) { 834d2c5d77fSJohan Hedberg struct hci_cp_read_local_ext_features cp; 835d2c5d77fSJohan Hedberg 836d2c5d77fSJohan Hedberg cp.page = p; 837d2c5d77fSJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES, 838d2c5d77fSJohan Hedberg sizeof(cp), &cp); 839d2c5d77fSJohan Hedberg } 8402177bab5SJohan Hedberg } 8412177bab5SJohan Hedberg 8425d4e7e8dSJohan Hedberg static void hci_init4_req(struct hci_request *req, unsigned long opt) 8435d4e7e8dSJohan Hedberg { 8445d4e7e8dSJohan Hedberg struct hci_dev *hdev = req->hdev; 8455d4e7e8dSJohan Hedberg 84636f260ceSMarcel Holtmann /* Some Broadcom based Bluetooth controllers do not support the 84736f260ceSMarcel Holtmann * Delete Stored Link Key command. They are clearly indicating its 84836f260ceSMarcel Holtmann * absence in the bit mask of supported commands. 84936f260ceSMarcel Holtmann * 85036f260ceSMarcel Holtmann * Check the supported commands and only if the the command is marked 85136f260ceSMarcel Holtmann * as supported send it. If not supported assume that the controller 85236f260ceSMarcel Holtmann * does not have actual support for stored link keys which makes this 85336f260ceSMarcel Holtmann * command redundant anyway. 85436f260ceSMarcel Holtmann * 85536f260ceSMarcel Holtmann * Some controllers indicate that they support handling deleting 85636f260ceSMarcel Holtmann * stored link keys, but they don't. The quirk lets a driver 85736f260ceSMarcel Holtmann * just disable this command. 85836f260ceSMarcel Holtmann */ 85936f260ceSMarcel Holtmann if (hdev->commands[6] & 0x80 && 86036f260ceSMarcel Holtmann !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) { 86136f260ceSMarcel Holtmann struct hci_cp_delete_stored_link_key cp; 86236f260ceSMarcel Holtmann 86336f260ceSMarcel Holtmann bacpy(&cp.bdaddr, BDADDR_ANY); 86436f260ceSMarcel Holtmann cp.delete_all = 0x01; 86536f260ceSMarcel Holtmann hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY, 86636f260ceSMarcel Holtmann sizeof(cp), &cp); 86736f260ceSMarcel Holtmann } 86836f260ceSMarcel Holtmann 869d62e6d67SJohan Hedberg /* Set event mask page 2 if the HCI command for it is supported */ 870d62e6d67SJohan Hedberg if (hdev->commands[22] & 0x04) 871d62e6d67SJohan Hedberg hci_set_event_mask_page_2(req); 872d62e6d67SJohan Hedberg 873109e3191SMarcel Holtmann /* Read local codec list if the HCI command is supported */ 874109e3191SMarcel Holtmann if (hdev->commands[29] & 0x20) 875109e3191SMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL); 876109e3191SMarcel Holtmann 877f4fe73edSMarcel Holtmann /* Get MWS transport configuration if the HCI command is supported */ 878f4fe73edSMarcel Holtmann if (hdev->commands[30] & 0x08) 879f4fe73edSMarcel Holtmann hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL); 880f4fe73edSMarcel Holtmann 8815d4e7e8dSJohan Hedberg /* Check for Synchronization Train support */ 88253b834d2SMarcel Holtmann if (lmp_sync_train_capable(hdev)) 8835d4e7e8dSJohan Hedberg hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL); 884a6d0d690SMarcel Holtmann 885a6d0d690SMarcel Holtmann /* Enable Secure Connections if supported and configured */ 886d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED) && 887574ea3c7SMarcel Holtmann bredr_sc_enabled(hdev)) { 888a6d0d690SMarcel Holtmann u8 support = 0x01; 889574ea3c7SMarcel Holtmann 890a6d0d690SMarcel Holtmann hci_req_add(req, HCI_OP_WRITE_SC_SUPPORT, 891a6d0d690SMarcel Holtmann sizeof(support), &support); 892a6d0d690SMarcel Holtmann } 8935d4e7e8dSJohan Hedberg } 8945d4e7e8dSJohan Hedberg 8952177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev) 8962177bab5SJohan Hedberg { 8972177bab5SJohan Hedberg int err; 8982177bab5SJohan Hedberg 8992177bab5SJohan Hedberg err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT); 9002177bab5SJohan Hedberg if (err < 0) 9012177bab5SJohan Hedberg return err; 9022177bab5SJohan Hedberg 903d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SETUP)) { 9044b4113d6SMarcel Holtmann /* The Device Under Test (DUT) mode is special and available 9054b4113d6SMarcel Holtmann * for all controller types. So just create it early on. 9064b4113d6SMarcel Holtmann */ 9074b4148e9SMarcel Holtmann debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev, 9084b4148e9SMarcel Holtmann &dut_mode_fops); 9094b4113d6SMarcel Holtmann 9104b4113d6SMarcel Holtmann /* When the driver supports the set_diag callback, then 9114b4113d6SMarcel Holtmann * expose an entry to modify the vendor diagnostic setting. 9124b4113d6SMarcel Holtmann */ 9134b4113d6SMarcel Holtmann if (hdev->set_diag) 9144b4113d6SMarcel Holtmann debugfs_create_file("vendor_diag", 0644, hdev->debugfs, 9154b4113d6SMarcel Holtmann hdev, &vendor_diag_fops); 9164b4148e9SMarcel Holtmann } 9174b4148e9SMarcel Holtmann 9182177bab5SJohan Hedberg err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT); 9192177bab5SJohan Hedberg if (err < 0) 9202177bab5SJohan Hedberg return err; 9212177bab5SJohan Hedberg 9220af801b9SJohan Hedberg /* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode 9230af801b9SJohan Hedberg * BR/EDR/LE type controllers. AMP controllers only need the 9240af801b9SJohan Hedberg * first two stages of init. 9250af801b9SJohan Hedberg */ 9260af801b9SJohan Hedberg if (hdev->dev_type != HCI_BREDR) 9270af801b9SJohan Hedberg return 0; 9280af801b9SJohan Hedberg 9295d4e7e8dSJohan Hedberg err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT); 9305d4e7e8dSJohan Hedberg if (err < 0) 9315d4e7e8dSJohan Hedberg return err; 9325d4e7e8dSJohan Hedberg 933baf27f6eSMarcel Holtmann err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT); 934baf27f6eSMarcel Holtmann if (err < 0) 935baf27f6eSMarcel Holtmann return err; 936baf27f6eSMarcel Holtmann 937ec6cef9cSMarcel Holtmann /* This function is only called when the controller is actually in 938ec6cef9cSMarcel Holtmann * configured state. When the controller is marked as unconfigured, 939ec6cef9cSMarcel Holtmann * this initialization procedure is not run. 940ec6cef9cSMarcel Holtmann * 941ec6cef9cSMarcel Holtmann * It means that it is possible that a controller runs through its 942ec6cef9cSMarcel Holtmann * setup phase and then discovers missing settings. If that is the 943ec6cef9cSMarcel Holtmann * case, then this function will not be called. It then will only 944ec6cef9cSMarcel Holtmann * be called during the config phase. 945ec6cef9cSMarcel Holtmann * 946ec6cef9cSMarcel Holtmann * So only when in setup phase or config phase, create the debugfs 947ec6cef9cSMarcel Holtmann * entries and register the SMP channels. 948baf27f6eSMarcel Holtmann */ 949d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 950d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) 951baf27f6eSMarcel Holtmann return 0; 952baf27f6eSMarcel Holtmann 95360c5f5fbSMarcel Holtmann hci_debugfs_create_common(hdev); 95460c5f5fbSMarcel Holtmann 95571c3b60eSMarcel Holtmann if (lmp_bredr_capable(hdev)) 95660c5f5fbSMarcel Holtmann hci_debugfs_create_bredr(hdev); 9572bfa3531SMarcel Holtmann 958162a3bacSMarcel Holtmann if (lmp_le_capable(hdev)) 95960c5f5fbSMarcel Holtmann hci_debugfs_create_le(hdev); 960e7b8fc92SMarcel Holtmann 961baf27f6eSMarcel Holtmann return 0; 9622177bab5SJohan Hedberg } 9632177bab5SJohan Hedberg 9640ebca7d6SMarcel Holtmann static void hci_init0_req(struct hci_request *req, unsigned long opt) 9650ebca7d6SMarcel Holtmann { 9660ebca7d6SMarcel Holtmann struct hci_dev *hdev = req->hdev; 9670ebca7d6SMarcel Holtmann 9680ebca7d6SMarcel Holtmann BT_DBG("%s %ld", hdev->name, opt); 9690ebca7d6SMarcel Holtmann 9700ebca7d6SMarcel Holtmann /* Reset */ 9710ebca7d6SMarcel Holtmann if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) 9720ebca7d6SMarcel Holtmann hci_reset_req(req, 0); 9730ebca7d6SMarcel Holtmann 9740ebca7d6SMarcel Holtmann /* Read Local Version */ 9750ebca7d6SMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 9760ebca7d6SMarcel Holtmann 9770ebca7d6SMarcel Holtmann /* Read BD Address */ 9780ebca7d6SMarcel Holtmann if (hdev->set_bdaddr) 9790ebca7d6SMarcel Holtmann hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL); 9800ebca7d6SMarcel Holtmann } 9810ebca7d6SMarcel Holtmann 9820ebca7d6SMarcel Holtmann static int __hci_unconf_init(struct hci_dev *hdev) 9830ebca7d6SMarcel Holtmann { 9840ebca7d6SMarcel Holtmann int err; 9850ebca7d6SMarcel Holtmann 986cc78b44bSMarcel Holtmann if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) 987cc78b44bSMarcel Holtmann return 0; 988cc78b44bSMarcel Holtmann 9890ebca7d6SMarcel Holtmann err = __hci_req_sync(hdev, hci_init0_req, 0, HCI_INIT_TIMEOUT); 9900ebca7d6SMarcel Holtmann if (err < 0) 9910ebca7d6SMarcel Holtmann return err; 9920ebca7d6SMarcel Holtmann 9930ebca7d6SMarcel Holtmann return 0; 9940ebca7d6SMarcel Holtmann } 9950ebca7d6SMarcel Holtmann 99642c6b129SJohan Hedberg static void hci_scan_req(struct hci_request *req, unsigned long opt) 9971da177e4SLinus Torvalds { 9981da177e4SLinus Torvalds __u8 scan = opt; 9991da177e4SLinus Torvalds 100042c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, scan); 10011da177e4SLinus Torvalds 10021da177e4SLinus Torvalds /* Inquiry and Page scans */ 100342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); 10041da177e4SLinus Torvalds } 10051da177e4SLinus Torvalds 100642c6b129SJohan Hedberg static void hci_auth_req(struct hci_request *req, unsigned long opt) 10071da177e4SLinus Torvalds { 10081da177e4SLinus Torvalds __u8 auth = opt; 10091da177e4SLinus Torvalds 101042c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, auth); 10111da177e4SLinus Torvalds 10121da177e4SLinus Torvalds /* Authentication */ 101342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth); 10141da177e4SLinus Torvalds } 10151da177e4SLinus Torvalds 101642c6b129SJohan Hedberg static void hci_encrypt_req(struct hci_request *req, unsigned long opt) 10171da177e4SLinus Torvalds { 10181da177e4SLinus Torvalds __u8 encrypt = opt; 10191da177e4SLinus Torvalds 102042c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, encrypt); 10211da177e4SLinus Torvalds 1022e4e8e37cSMarcel Holtmann /* Encryption */ 102342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt); 10241da177e4SLinus Torvalds } 10251da177e4SLinus Torvalds 102642c6b129SJohan Hedberg static void hci_linkpol_req(struct hci_request *req, unsigned long opt) 1027e4e8e37cSMarcel Holtmann { 1028e4e8e37cSMarcel Holtmann __le16 policy = cpu_to_le16(opt); 1029e4e8e37cSMarcel Holtmann 103042c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, policy); 1031e4e8e37cSMarcel Holtmann 1032e4e8e37cSMarcel Holtmann /* Default link policy */ 103342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy); 1034e4e8e37cSMarcel Holtmann } 1035e4e8e37cSMarcel Holtmann 10361da177e4SLinus Torvalds /* Get HCI device by index. 10371da177e4SLinus Torvalds * Device is held on return. */ 10381da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index) 10391da177e4SLinus Torvalds { 10408035ded4SLuiz Augusto von Dentz struct hci_dev *hdev = NULL, *d; 10411da177e4SLinus Torvalds 10421da177e4SLinus Torvalds BT_DBG("%d", index); 10431da177e4SLinus Torvalds 10441da177e4SLinus Torvalds if (index < 0) 10451da177e4SLinus Torvalds return NULL; 10461da177e4SLinus Torvalds 10471da177e4SLinus Torvalds read_lock(&hci_dev_list_lock); 10488035ded4SLuiz Augusto von Dentz list_for_each_entry(d, &hci_dev_list, list) { 10491da177e4SLinus Torvalds if (d->id == index) { 10501da177e4SLinus Torvalds hdev = hci_dev_hold(d); 10511da177e4SLinus Torvalds break; 10521da177e4SLinus Torvalds } 10531da177e4SLinus Torvalds } 10541da177e4SLinus Torvalds read_unlock(&hci_dev_list_lock); 10551da177e4SLinus Torvalds return hdev; 10561da177e4SLinus Torvalds } 10571da177e4SLinus Torvalds 10581da177e4SLinus Torvalds /* ---- Inquiry support ---- */ 1059ff9ef578SJohan Hedberg 106030dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev) 106130dc78e1SJohan Hedberg { 106230dc78e1SJohan Hedberg struct discovery_state *discov = &hdev->discovery; 106330dc78e1SJohan Hedberg 10646fbe195dSAndre Guedes switch (discov->state) { 1065343f935bSAndre Guedes case DISCOVERY_FINDING: 10666fbe195dSAndre Guedes case DISCOVERY_RESOLVING: 106730dc78e1SJohan Hedberg return true; 106830dc78e1SJohan Hedberg 10696fbe195dSAndre Guedes default: 107030dc78e1SJohan Hedberg return false; 107130dc78e1SJohan Hedberg } 10726fbe195dSAndre Guedes } 107330dc78e1SJohan Hedberg 1074ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state) 1075ff9ef578SJohan Hedberg { 1076bb3e0a33SJohan Hedberg int old_state = hdev->discovery.state; 1077bb3e0a33SJohan Hedberg 1078ff9ef578SJohan Hedberg BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state); 1079ff9ef578SJohan Hedberg 1080bb3e0a33SJohan Hedberg if (old_state == state) 1081ff9ef578SJohan Hedberg return; 1082ff9ef578SJohan Hedberg 1083bb3e0a33SJohan Hedberg hdev->discovery.state = state; 1084bb3e0a33SJohan Hedberg 1085ff9ef578SJohan Hedberg switch (state) { 1086ff9ef578SJohan Hedberg case DISCOVERY_STOPPED: 1087c54c3860SAndre Guedes hci_update_background_scan(hdev); 1088c54c3860SAndre Guedes 1089bb3e0a33SJohan Hedberg if (old_state != DISCOVERY_STARTING) 1090ff9ef578SJohan Hedberg mgmt_discovering(hdev, 0); 1091ff9ef578SJohan Hedberg break; 1092ff9ef578SJohan Hedberg case DISCOVERY_STARTING: 1093ff9ef578SJohan Hedberg break; 1094343f935bSAndre Guedes case DISCOVERY_FINDING: 1095ff9ef578SJohan Hedberg mgmt_discovering(hdev, 1); 1096ff9ef578SJohan Hedberg break; 109730dc78e1SJohan Hedberg case DISCOVERY_RESOLVING: 109830dc78e1SJohan Hedberg break; 1099ff9ef578SJohan Hedberg case DISCOVERY_STOPPING: 1100ff9ef578SJohan Hedberg break; 1101ff9ef578SJohan Hedberg } 1102ff9ef578SJohan Hedberg } 1103ff9ef578SJohan Hedberg 11041f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev) 11051da177e4SLinus Torvalds { 110630883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1107b57c1a56SJohan Hedberg struct inquiry_entry *p, *n; 11081da177e4SLinus Torvalds 1109561aafbcSJohan Hedberg list_for_each_entry_safe(p, n, &cache->all, all) { 1110561aafbcSJohan Hedberg list_del(&p->all); 1111b57c1a56SJohan Hedberg kfree(p); 11121da177e4SLinus Torvalds } 1113561aafbcSJohan Hedberg 1114561aafbcSJohan Hedberg INIT_LIST_HEAD(&cache->unknown); 1115561aafbcSJohan Hedberg INIT_LIST_HEAD(&cache->resolve); 11161da177e4SLinus Torvalds } 11171da177e4SLinus Torvalds 1118a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, 1119a8c5fb1aSGustavo Padovan bdaddr_t *bdaddr) 11201da177e4SLinus Torvalds { 112130883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 11221da177e4SLinus Torvalds struct inquiry_entry *e; 11231da177e4SLinus Torvalds 11246ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, bdaddr); 11251da177e4SLinus Torvalds 1126561aafbcSJohan Hedberg list_for_each_entry(e, &cache->all, all) { 11271da177e4SLinus Torvalds if (!bacmp(&e->data.bdaddr, bdaddr)) 11281da177e4SLinus Torvalds return e; 11291da177e4SLinus Torvalds } 11301da177e4SLinus Torvalds 1131b57c1a56SJohan Hedberg return NULL; 1132b57c1a56SJohan Hedberg } 1133b57c1a56SJohan Hedberg 1134561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev, 1135561aafbcSJohan Hedberg bdaddr_t *bdaddr) 1136561aafbcSJohan Hedberg { 113730883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1138561aafbcSJohan Hedberg struct inquiry_entry *e; 1139561aafbcSJohan Hedberg 11406ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, bdaddr); 1141561aafbcSJohan Hedberg 1142561aafbcSJohan Hedberg list_for_each_entry(e, &cache->unknown, list) { 1143561aafbcSJohan Hedberg if (!bacmp(&e->data.bdaddr, bdaddr)) 1144561aafbcSJohan Hedberg return e; 1145561aafbcSJohan Hedberg } 1146561aafbcSJohan Hedberg 1147561aafbcSJohan Hedberg return NULL; 1148561aafbcSJohan Hedberg } 1149561aafbcSJohan Hedberg 115030dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev, 115130dc78e1SJohan Hedberg bdaddr_t *bdaddr, 115230dc78e1SJohan Hedberg int state) 115330dc78e1SJohan Hedberg { 115430dc78e1SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 115530dc78e1SJohan Hedberg struct inquiry_entry *e; 115630dc78e1SJohan Hedberg 11576ed93dc6SAndrei Emeltchenko BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state); 115830dc78e1SJohan Hedberg 115930dc78e1SJohan Hedberg list_for_each_entry(e, &cache->resolve, list) { 116030dc78e1SJohan Hedberg if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state) 116130dc78e1SJohan Hedberg return e; 116230dc78e1SJohan Hedberg if (!bacmp(&e->data.bdaddr, bdaddr)) 116330dc78e1SJohan Hedberg return e; 116430dc78e1SJohan Hedberg } 116530dc78e1SJohan Hedberg 116630dc78e1SJohan Hedberg return NULL; 116730dc78e1SJohan Hedberg } 116830dc78e1SJohan Hedberg 1169a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev, 1170a3d4e20aSJohan Hedberg struct inquiry_entry *ie) 1171a3d4e20aSJohan Hedberg { 1172a3d4e20aSJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1173a3d4e20aSJohan Hedberg struct list_head *pos = &cache->resolve; 1174a3d4e20aSJohan Hedberg struct inquiry_entry *p; 1175a3d4e20aSJohan Hedberg 1176a3d4e20aSJohan Hedberg list_del(&ie->list); 1177a3d4e20aSJohan Hedberg 1178a3d4e20aSJohan Hedberg list_for_each_entry(p, &cache->resolve, list) { 1179a3d4e20aSJohan Hedberg if (p->name_state != NAME_PENDING && 1180a3d4e20aSJohan Hedberg abs(p->data.rssi) >= abs(ie->data.rssi)) 1181a3d4e20aSJohan Hedberg break; 1182a3d4e20aSJohan Hedberg pos = &p->list; 1183a3d4e20aSJohan Hedberg } 1184a3d4e20aSJohan Hedberg 1185a3d4e20aSJohan Hedberg list_add(&ie->list, pos); 1186a3d4e20aSJohan Hedberg } 1187a3d4e20aSJohan Hedberg 1188af58925cSMarcel Holtmann u32 hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data, 1189af58925cSMarcel Holtmann bool name_known) 11901da177e4SLinus Torvalds { 119130883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 119270f23020SAndrei Emeltchenko struct inquiry_entry *ie; 1193af58925cSMarcel Holtmann u32 flags = 0; 11941da177e4SLinus Torvalds 11956ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, &data->bdaddr); 11961da177e4SLinus Torvalds 11976928a924SJohan Hedberg hci_remove_remote_oob_data(hdev, &data->bdaddr, BDADDR_BREDR); 11982b2fec4dSSzymon Janc 1199af58925cSMarcel Holtmann if (!data->ssp_mode) 1200af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_LEGACY_PAIRING; 1201388fc8faSJohan Hedberg 120270f23020SAndrei Emeltchenko ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr); 1203a3d4e20aSJohan Hedberg if (ie) { 1204af58925cSMarcel Holtmann if (!ie->data.ssp_mode) 1205af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_LEGACY_PAIRING; 1206388fc8faSJohan Hedberg 1207a3d4e20aSJohan Hedberg if (ie->name_state == NAME_NEEDED && 1208a3d4e20aSJohan Hedberg data->rssi != ie->data.rssi) { 1209a3d4e20aSJohan Hedberg ie->data.rssi = data->rssi; 1210a3d4e20aSJohan Hedberg hci_inquiry_cache_update_resolve(hdev, ie); 1211a3d4e20aSJohan Hedberg } 1212a3d4e20aSJohan Hedberg 1213561aafbcSJohan Hedberg goto update; 1214a3d4e20aSJohan Hedberg } 1215561aafbcSJohan Hedberg 12161da177e4SLinus Torvalds /* Entry not in the cache. Add new one. */ 121727f70f3eSJohan Hedberg ie = kzalloc(sizeof(*ie), GFP_KERNEL); 1218af58925cSMarcel Holtmann if (!ie) { 1219af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_CONFIRM_NAME; 1220af58925cSMarcel Holtmann goto done; 1221af58925cSMarcel Holtmann } 122270f23020SAndrei Emeltchenko 1223561aafbcSJohan Hedberg list_add(&ie->all, &cache->all); 1224561aafbcSJohan Hedberg 1225561aafbcSJohan Hedberg if (name_known) { 1226561aafbcSJohan Hedberg ie->name_state = NAME_KNOWN; 1227561aafbcSJohan Hedberg } else { 1228561aafbcSJohan Hedberg ie->name_state = NAME_NOT_KNOWN; 1229561aafbcSJohan Hedberg list_add(&ie->list, &cache->unknown); 1230561aafbcSJohan Hedberg } 1231561aafbcSJohan Hedberg 1232561aafbcSJohan Hedberg update: 1233561aafbcSJohan Hedberg if (name_known && ie->name_state != NAME_KNOWN && 1234561aafbcSJohan Hedberg ie->name_state != NAME_PENDING) { 1235561aafbcSJohan Hedberg ie->name_state = NAME_KNOWN; 1236561aafbcSJohan Hedberg list_del(&ie->list); 12371da177e4SLinus Torvalds } 12381da177e4SLinus Torvalds 123970f23020SAndrei Emeltchenko memcpy(&ie->data, data, sizeof(*data)); 124070f23020SAndrei Emeltchenko ie->timestamp = jiffies; 12411da177e4SLinus Torvalds cache->timestamp = jiffies; 12423175405bSJohan Hedberg 12433175405bSJohan Hedberg if (ie->name_state == NAME_NOT_KNOWN) 1244af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_CONFIRM_NAME; 12453175405bSJohan Hedberg 1246af58925cSMarcel Holtmann done: 1247af58925cSMarcel Holtmann return flags; 12481da177e4SLinus Torvalds } 12491da177e4SLinus Torvalds 12501da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf) 12511da177e4SLinus Torvalds { 125230883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 12531da177e4SLinus Torvalds struct inquiry_info *info = (struct inquiry_info *) buf; 12541da177e4SLinus Torvalds struct inquiry_entry *e; 12551da177e4SLinus Torvalds int copied = 0; 12561da177e4SLinus Torvalds 1257561aafbcSJohan Hedberg list_for_each_entry(e, &cache->all, all) { 12581da177e4SLinus Torvalds struct inquiry_data *data = &e->data; 1259b57c1a56SJohan Hedberg 1260b57c1a56SJohan Hedberg if (copied >= num) 1261b57c1a56SJohan Hedberg break; 1262b57c1a56SJohan Hedberg 12631da177e4SLinus Torvalds bacpy(&info->bdaddr, &data->bdaddr); 12641da177e4SLinus Torvalds info->pscan_rep_mode = data->pscan_rep_mode; 12651da177e4SLinus Torvalds info->pscan_period_mode = data->pscan_period_mode; 12661da177e4SLinus Torvalds info->pscan_mode = data->pscan_mode; 12671da177e4SLinus Torvalds memcpy(info->dev_class, data->dev_class, 3); 12681da177e4SLinus Torvalds info->clock_offset = data->clock_offset; 1269b57c1a56SJohan Hedberg 12701da177e4SLinus Torvalds info++; 1271b57c1a56SJohan Hedberg copied++; 12721da177e4SLinus Torvalds } 12731da177e4SLinus Torvalds 12741da177e4SLinus Torvalds BT_DBG("cache %p, copied %d", cache, copied); 12751da177e4SLinus Torvalds return copied; 12761da177e4SLinus Torvalds } 12771da177e4SLinus Torvalds 127842c6b129SJohan Hedberg static void hci_inq_req(struct hci_request *req, unsigned long opt) 12791da177e4SLinus Torvalds { 12801da177e4SLinus Torvalds struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt; 128142c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 12821da177e4SLinus Torvalds struct hci_cp_inquiry cp; 12831da177e4SLinus Torvalds 12841da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 12851da177e4SLinus Torvalds 12861da177e4SLinus Torvalds if (test_bit(HCI_INQUIRY, &hdev->flags)) 12871da177e4SLinus Torvalds return; 12881da177e4SLinus Torvalds 12891da177e4SLinus Torvalds /* Start Inquiry */ 12901da177e4SLinus Torvalds memcpy(&cp.lap, &ir->lap, 3); 12911da177e4SLinus Torvalds cp.length = ir->length; 12921da177e4SLinus Torvalds cp.num_rsp = ir->num_rsp; 129342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp); 12941da177e4SLinus Torvalds } 12951da177e4SLinus Torvalds 12961da177e4SLinus Torvalds int hci_inquiry(void __user *arg) 12971da177e4SLinus Torvalds { 12981da177e4SLinus Torvalds __u8 __user *ptr = arg; 12991da177e4SLinus Torvalds struct hci_inquiry_req ir; 13001da177e4SLinus Torvalds struct hci_dev *hdev; 13011da177e4SLinus Torvalds int err = 0, do_inquiry = 0, max_rsp; 13021da177e4SLinus Torvalds long timeo; 13031da177e4SLinus Torvalds __u8 *buf; 13041da177e4SLinus Torvalds 13051da177e4SLinus Torvalds if (copy_from_user(&ir, ptr, sizeof(ir))) 13061da177e4SLinus Torvalds return -EFAULT; 13071da177e4SLinus Torvalds 13085a08ecceSAndrei Emeltchenko hdev = hci_dev_get(ir.dev_id); 13095a08ecceSAndrei Emeltchenko if (!hdev) 13101da177e4SLinus Torvalds return -ENODEV; 13111da177e4SLinus Torvalds 1312d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 13130736cfa8SMarcel Holtmann err = -EBUSY; 13140736cfa8SMarcel Holtmann goto done; 13150736cfa8SMarcel Holtmann } 13160736cfa8SMarcel Holtmann 1317d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1318fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1319fee746b0SMarcel Holtmann goto done; 1320fee746b0SMarcel Holtmann } 1321fee746b0SMarcel Holtmann 13225b69bef5SMarcel Holtmann if (hdev->dev_type != HCI_BREDR) { 13235b69bef5SMarcel Holtmann err = -EOPNOTSUPP; 13245b69bef5SMarcel Holtmann goto done; 13255b69bef5SMarcel Holtmann } 13265b69bef5SMarcel Holtmann 1327d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { 132856f87901SJohan Hedberg err = -EOPNOTSUPP; 132956f87901SJohan Hedberg goto done; 133056f87901SJohan Hedberg } 133156f87901SJohan Hedberg 133209fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 13331da177e4SLinus Torvalds if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX || 1334a8c5fb1aSGustavo Padovan inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) { 13351f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 13361da177e4SLinus Torvalds do_inquiry = 1; 13371da177e4SLinus Torvalds } 133809fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 13391da177e4SLinus Torvalds 134004837f64SMarcel Holtmann timeo = ir.length * msecs_to_jiffies(2000); 134170f23020SAndrei Emeltchenko 134270f23020SAndrei Emeltchenko if (do_inquiry) { 134301178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir, 134401178cd4SJohan Hedberg timeo); 134570f23020SAndrei Emeltchenko if (err < 0) 13461da177e4SLinus Torvalds goto done; 13473e13fa1eSAndre Guedes 13483e13fa1eSAndre Guedes /* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is 13493e13fa1eSAndre Guedes * cleared). If it is interrupted by a signal, return -EINTR. 13503e13fa1eSAndre Guedes */ 135174316201SNeilBrown if (wait_on_bit(&hdev->flags, HCI_INQUIRY, 13523e13fa1eSAndre Guedes TASK_INTERRUPTIBLE)) 13533e13fa1eSAndre Guedes return -EINTR; 135470f23020SAndrei Emeltchenko } 13551da177e4SLinus Torvalds 13568fc9ced3SGustavo Padovan /* for unlimited number of responses we will use buffer with 13578fc9ced3SGustavo Padovan * 255 entries 13588fc9ced3SGustavo Padovan */ 13591da177e4SLinus Torvalds max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp; 13601da177e4SLinus Torvalds 13611da177e4SLinus Torvalds /* cache_dump can't sleep. Therefore we allocate temp buffer and then 13621da177e4SLinus Torvalds * copy it to the user space. 13631da177e4SLinus Torvalds */ 136470f23020SAndrei Emeltchenko buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL); 136570f23020SAndrei Emeltchenko if (!buf) { 13661da177e4SLinus Torvalds err = -ENOMEM; 13671da177e4SLinus Torvalds goto done; 13681da177e4SLinus Torvalds } 13691da177e4SLinus Torvalds 137009fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 13711da177e4SLinus Torvalds ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf); 137209fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 13731da177e4SLinus Torvalds 13741da177e4SLinus Torvalds BT_DBG("num_rsp %d", ir.num_rsp); 13751da177e4SLinus Torvalds 13761da177e4SLinus Torvalds if (!copy_to_user(ptr, &ir, sizeof(ir))) { 13771da177e4SLinus Torvalds ptr += sizeof(ir); 13781da177e4SLinus Torvalds if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) * 13791da177e4SLinus Torvalds ir.num_rsp)) 13801da177e4SLinus Torvalds err = -EFAULT; 13811da177e4SLinus Torvalds } else 13821da177e4SLinus Torvalds err = -EFAULT; 13831da177e4SLinus Torvalds 13841da177e4SLinus Torvalds kfree(buf); 13851da177e4SLinus Torvalds 13861da177e4SLinus Torvalds done: 13871da177e4SLinus Torvalds hci_dev_put(hdev); 13881da177e4SLinus Torvalds return err; 13891da177e4SLinus Torvalds } 13901da177e4SLinus Torvalds 1391cbed0ca1SJohan Hedberg static int hci_dev_do_open(struct hci_dev *hdev) 13921da177e4SLinus Torvalds { 13931da177e4SLinus Torvalds int ret = 0; 13941da177e4SLinus Torvalds 13951da177e4SLinus Torvalds BT_DBG("%s %p", hdev->name, hdev); 13961da177e4SLinus Torvalds 13971da177e4SLinus Torvalds hci_req_lock(hdev); 13981da177e4SLinus Torvalds 1399d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) { 140094324962SJohan Hovold ret = -ENODEV; 140194324962SJohan Hovold goto done; 140294324962SJohan Hovold } 140394324962SJohan Hovold 1404d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 1405d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) { 1406a5c8f270SMarcel Holtmann /* Check for rfkill but allow the HCI setup stage to 1407a5c8f270SMarcel Holtmann * proceed (which in itself doesn't cause any RF activity). 1408bf543036SJohan Hedberg */ 1409d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_RFKILLED)) { 1410611b30f7SMarcel Holtmann ret = -ERFKILL; 1411611b30f7SMarcel Holtmann goto done; 1412611b30f7SMarcel Holtmann } 1413611b30f7SMarcel Holtmann 1414a5c8f270SMarcel Holtmann /* Check for valid public address or a configured static 1415a5c8f270SMarcel Holtmann * random adddress, but let the HCI setup proceed to 1416a5c8f270SMarcel Holtmann * be able to determine if there is a public address 1417a5c8f270SMarcel Holtmann * or not. 1418a5c8f270SMarcel Holtmann * 1419c6beca0eSMarcel Holtmann * In case of user channel usage, it is not important 1420c6beca0eSMarcel Holtmann * if a public address or static random address is 1421c6beca0eSMarcel Holtmann * available. 1422c6beca0eSMarcel Holtmann * 1423a5c8f270SMarcel Holtmann * This check is only valid for BR/EDR controllers 1424a5c8f270SMarcel Holtmann * since AMP controllers do not have an address. 1425a5c8f270SMarcel Holtmann */ 1426d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 1427c6beca0eSMarcel Holtmann hdev->dev_type == HCI_BREDR && 1428a5c8f270SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) && 1429a5c8f270SMarcel Holtmann !bacmp(&hdev->static_addr, BDADDR_ANY)) { 1430a5c8f270SMarcel Holtmann ret = -EADDRNOTAVAIL; 1431a5c8f270SMarcel Holtmann goto done; 1432a5c8f270SMarcel Holtmann } 1433a5c8f270SMarcel Holtmann } 1434a5c8f270SMarcel Holtmann 14351da177e4SLinus Torvalds if (test_bit(HCI_UP, &hdev->flags)) { 14361da177e4SLinus Torvalds ret = -EALREADY; 14371da177e4SLinus Torvalds goto done; 14381da177e4SLinus Torvalds } 14391da177e4SLinus Torvalds 14401da177e4SLinus Torvalds if (hdev->open(hdev)) { 14411da177e4SLinus Torvalds ret = -EIO; 14421da177e4SLinus Torvalds goto done; 14431da177e4SLinus Torvalds } 14441da177e4SLinus Torvalds 1445e9ca8bf1SMarcel Holtmann set_bit(HCI_RUNNING, &hdev->flags); 14464a3f95b7SMarcel Holtmann hci_notify(hdev, HCI_DEV_OPEN); 14474a3f95b7SMarcel Holtmann 14481da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 14491da177e4SLinus Torvalds set_bit(HCI_INIT, &hdev->flags); 1450f41c70c4SMarcel Holtmann 1451d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SETUP)) { 1452af202f84SMarcel Holtmann if (hdev->setup) 1453f41c70c4SMarcel Holtmann ret = hdev->setup(hdev); 1454f41c70c4SMarcel Holtmann 1455af202f84SMarcel Holtmann /* The transport driver can set these quirks before 1456af202f84SMarcel Holtmann * creating the HCI device or in its setup callback. 1457af202f84SMarcel Holtmann * 1458af202f84SMarcel Holtmann * In case any of them is set, the controller has to 1459af202f84SMarcel Holtmann * start up as unconfigured. 1460af202f84SMarcel Holtmann */ 1461eb1904f4SMarcel Holtmann if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || 1462eb1904f4SMarcel Holtmann test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks)) 1463a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNCONFIGURED); 1464f41c70c4SMarcel Holtmann 14650ebca7d6SMarcel Holtmann /* For an unconfigured controller it is required to 14660ebca7d6SMarcel Holtmann * read at least the version information provided by 14670ebca7d6SMarcel Holtmann * the Read Local Version Information command. 14680ebca7d6SMarcel Holtmann * 14690ebca7d6SMarcel Holtmann * If the set_bdaddr driver callback is provided, then 14700ebca7d6SMarcel Holtmann * also the original Bluetooth public device address 14710ebca7d6SMarcel Holtmann * will be read using the Read BD Address command. 14720ebca7d6SMarcel Holtmann */ 1473d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 14740ebca7d6SMarcel Holtmann ret = __hci_unconf_init(hdev); 147589bc22d2SMarcel Holtmann } 147689bc22d2SMarcel Holtmann 1477d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_CONFIG)) { 14789713c17bSMarcel Holtmann /* If public address change is configured, ensure that 14799713c17bSMarcel Holtmann * the address gets programmed. If the driver does not 14809713c17bSMarcel Holtmann * support changing the public address, fail the power 14819713c17bSMarcel Holtmann * on procedure. 148224c457e2SMarcel Holtmann */ 14839713c17bSMarcel Holtmann if (bacmp(&hdev->public_addr, BDADDR_ANY) && 14849713c17bSMarcel Holtmann hdev->set_bdaddr) 148524c457e2SMarcel Holtmann ret = hdev->set_bdaddr(hdev, &hdev->public_addr); 148624c457e2SMarcel Holtmann else 148724c457e2SMarcel Holtmann ret = -EADDRNOTAVAIL; 148824c457e2SMarcel Holtmann } 148924c457e2SMarcel Holtmann 1490f41c70c4SMarcel Holtmann if (!ret) { 1491d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1492d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) 14932177bab5SJohan Hedberg ret = __hci_init(hdev); 14941da177e4SLinus Torvalds } 14951da177e4SLinus Torvalds 1496f41c70c4SMarcel Holtmann clear_bit(HCI_INIT, &hdev->flags); 1497f41c70c4SMarcel Holtmann 14981da177e4SLinus Torvalds if (!ret) { 14991da177e4SLinus Torvalds hci_dev_hold(hdev); 1500a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); 15011da177e4SLinus Torvalds set_bit(HCI_UP, &hdev->flags); 15021da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_UP); 1503d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 1504d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG) && 1505d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1506d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 15071514b892SMarcel Holtmann hdev->dev_type == HCI_BREDR) { 150809fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 1509744cf19eSJohan Hedberg mgmt_powered(hdev, 1); 151009fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 151156e5cb86SJohan Hedberg } 15121da177e4SLinus Torvalds } else { 15131da177e4SLinus Torvalds /* Init failed, cleanup */ 15143eff45eaSGustavo F. Padovan flush_work(&hdev->tx_work); 1515c347b765SGustavo F. Padovan flush_work(&hdev->cmd_work); 1516b78752ccSMarcel Holtmann flush_work(&hdev->rx_work); 15171da177e4SLinus Torvalds 15181da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 15191da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 15201da177e4SLinus Torvalds 15211da177e4SLinus Torvalds if (hdev->flush) 15221da177e4SLinus Torvalds hdev->flush(hdev); 15231da177e4SLinus Torvalds 15241da177e4SLinus Torvalds if (hdev->sent_cmd) { 15251da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 15261da177e4SLinus Torvalds hdev->sent_cmd = NULL; 15271da177e4SLinus Torvalds } 15281da177e4SLinus Torvalds 1529e9ca8bf1SMarcel Holtmann clear_bit(HCI_RUNNING, &hdev->flags); 15304a3f95b7SMarcel Holtmann hci_notify(hdev, HCI_DEV_CLOSE); 15314a3f95b7SMarcel Holtmann 15321da177e4SLinus Torvalds hdev->close(hdev); 1533fee746b0SMarcel Holtmann hdev->flags &= BIT(HCI_RAW); 15341da177e4SLinus Torvalds } 15351da177e4SLinus Torvalds 15361da177e4SLinus Torvalds done: 15371da177e4SLinus Torvalds hci_req_unlock(hdev); 15381da177e4SLinus Torvalds return ret; 15391da177e4SLinus Torvalds } 15401da177e4SLinus Torvalds 1541cbed0ca1SJohan Hedberg /* ---- HCI ioctl helpers ---- */ 1542cbed0ca1SJohan Hedberg 1543cbed0ca1SJohan Hedberg int hci_dev_open(__u16 dev) 1544cbed0ca1SJohan Hedberg { 1545cbed0ca1SJohan Hedberg struct hci_dev *hdev; 1546cbed0ca1SJohan Hedberg int err; 1547cbed0ca1SJohan Hedberg 1548cbed0ca1SJohan Hedberg hdev = hci_dev_get(dev); 1549cbed0ca1SJohan Hedberg if (!hdev) 1550cbed0ca1SJohan Hedberg return -ENODEV; 1551cbed0ca1SJohan Hedberg 15524a964404SMarcel Holtmann /* Devices that are marked as unconfigured can only be powered 1553fee746b0SMarcel Holtmann * up as user channel. Trying to bring them up as normal devices 1554fee746b0SMarcel Holtmann * will result into a failure. Only user channel operation is 1555fee746b0SMarcel Holtmann * possible. 1556fee746b0SMarcel Holtmann * 1557fee746b0SMarcel Holtmann * When this function is called for a user channel, the flag 1558fee746b0SMarcel Holtmann * HCI_USER_CHANNEL will be set first before attempting to 1559fee746b0SMarcel Holtmann * open the device. 1560fee746b0SMarcel Holtmann */ 1561d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1562d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 1563fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1564fee746b0SMarcel Holtmann goto done; 1565fee746b0SMarcel Holtmann } 1566fee746b0SMarcel Holtmann 1567e1d08f40SJohan Hedberg /* We need to ensure that no other power on/off work is pending 1568e1d08f40SJohan Hedberg * before proceeding to call hci_dev_do_open. This is 1569e1d08f40SJohan Hedberg * particularly important if the setup procedure has not yet 1570e1d08f40SJohan Hedberg * completed. 1571e1d08f40SJohan Hedberg */ 1572a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) 1573e1d08f40SJohan Hedberg cancel_delayed_work(&hdev->power_off); 1574e1d08f40SJohan Hedberg 1575a5c8f270SMarcel Holtmann /* After this call it is guaranteed that the setup procedure 1576a5c8f270SMarcel Holtmann * has finished. This means that error conditions like RFKILL 1577a5c8f270SMarcel Holtmann * or no valid public or static random address apply. 1578a5c8f270SMarcel Holtmann */ 1579e1d08f40SJohan Hedberg flush_workqueue(hdev->req_workqueue); 1580e1d08f40SJohan Hedberg 158112aa4f0aSMarcel Holtmann /* For controllers not using the management interface and that 1582b6ae8457SJohan Hedberg * are brought up using legacy ioctl, set the HCI_BONDABLE bit 158312aa4f0aSMarcel Holtmann * so that pairing works for them. Once the management interface 158412aa4f0aSMarcel Holtmann * is in use this bit will be cleared again and userspace has 158512aa4f0aSMarcel Holtmann * to explicitly enable it. 158612aa4f0aSMarcel Holtmann */ 1587d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 1588d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_MGMT)) 1589a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BONDABLE); 159012aa4f0aSMarcel Holtmann 1591cbed0ca1SJohan Hedberg err = hci_dev_do_open(hdev); 1592cbed0ca1SJohan Hedberg 1593fee746b0SMarcel Holtmann done: 1594cbed0ca1SJohan Hedberg hci_dev_put(hdev); 1595cbed0ca1SJohan Hedberg return err; 1596cbed0ca1SJohan Hedberg } 1597cbed0ca1SJohan Hedberg 1598d7347f3cSJohan Hedberg /* This function requires the caller holds hdev->lock */ 1599d7347f3cSJohan Hedberg static void hci_pend_le_actions_clear(struct hci_dev *hdev) 1600d7347f3cSJohan Hedberg { 1601d7347f3cSJohan Hedberg struct hci_conn_params *p; 1602d7347f3cSJohan Hedberg 1603f161dd41SJohan Hedberg list_for_each_entry(p, &hdev->le_conn_params, list) { 1604f161dd41SJohan Hedberg if (p->conn) { 1605f161dd41SJohan Hedberg hci_conn_drop(p->conn); 1606f8aaf9b6SJohan Hedberg hci_conn_put(p->conn); 1607f161dd41SJohan Hedberg p->conn = NULL; 1608f161dd41SJohan Hedberg } 1609d7347f3cSJohan Hedberg list_del_init(&p->action); 1610f161dd41SJohan Hedberg } 1611d7347f3cSJohan Hedberg 1612d7347f3cSJohan Hedberg BT_DBG("All LE pending actions cleared"); 1613d7347f3cSJohan Hedberg } 1614d7347f3cSJohan Hedberg 16156b3cc1dbSSimon Fels int hci_dev_do_close(struct hci_dev *hdev) 16161da177e4SLinus Torvalds { 16171da177e4SLinus Torvalds BT_DBG("%s %p", hdev->name, hdev); 16181da177e4SLinus Torvalds 1619d24d8144SGabriele Mazzotta if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) && 1620867146a0SLoic Poulain !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 1621d24d8144SGabriele Mazzotta test_bit(HCI_UP, &hdev->flags)) { 1622a44fecbdSTedd Ho-Jeong An /* Execute vendor specific shutdown routine */ 1623a44fecbdSTedd Ho-Jeong An if (hdev->shutdown) 1624a44fecbdSTedd Ho-Jeong An hdev->shutdown(hdev); 1625a44fecbdSTedd Ho-Jeong An } 1626a44fecbdSTedd Ho-Jeong An 162778c04c0bSVinicius Costa Gomes cancel_delayed_work(&hdev->power_off); 162878c04c0bSVinicius Costa Gomes 16291da177e4SLinus Torvalds hci_req_cancel(hdev, ENODEV); 16301da177e4SLinus Torvalds hci_req_lock(hdev); 16311da177e4SLinus Torvalds 16321da177e4SLinus Torvalds if (!test_and_clear_bit(HCI_UP, &hdev->flags)) { 163365cc2b49SMarcel Holtmann cancel_delayed_work_sync(&hdev->cmd_timer); 16341da177e4SLinus Torvalds hci_req_unlock(hdev); 16351da177e4SLinus Torvalds return 0; 16361da177e4SLinus Torvalds } 16371da177e4SLinus Torvalds 16383eff45eaSGustavo F. Padovan /* Flush RX and TX works */ 16393eff45eaSGustavo F. Padovan flush_work(&hdev->tx_work); 1640b78752ccSMarcel Holtmann flush_work(&hdev->rx_work); 16411da177e4SLinus Torvalds 164216ab91abSJohan Hedberg if (hdev->discov_timeout > 0) { 1643e0f9309fSJohan Hedberg cancel_delayed_work(&hdev->discov_off); 164416ab91abSJohan Hedberg hdev->discov_timeout = 0; 1645a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); 1646a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); 164716ab91abSJohan Hedberg } 164816ab91abSJohan Hedberg 1649a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) 16507d78525dSJohan Hedberg cancel_delayed_work(&hdev->service_cache); 16517d78525dSJohan Hedberg 16527ba8b4beSAndre Guedes cancel_delayed_work_sync(&hdev->le_scan_disable); 16532d28cfe7SJakub Pawlowski cancel_delayed_work_sync(&hdev->le_scan_restart); 16544518bb0fSJohan Hedberg 1655d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_MGMT)) 1656d6bfd59cSJohan Hedberg cancel_delayed_work_sync(&hdev->rpa_expired); 16577ba8b4beSAndre Guedes 16585d900e46SFlorian Grandel if (hdev->adv_instance_timeout) { 16595d900e46SFlorian Grandel cancel_delayed_work_sync(&hdev->adv_instance_expire); 16605d900e46SFlorian Grandel hdev->adv_instance_timeout = 0; 16615d900e46SFlorian Grandel } 16625d900e46SFlorian Grandel 166376727c02SJohan Hedberg /* Avoid potential lockdep warnings from the *_flush() calls by 166476727c02SJohan Hedberg * ensuring the workqueue is empty up front. 166576727c02SJohan Hedberg */ 166676727c02SJohan Hedberg drain_workqueue(hdev->workqueue); 166776727c02SJohan Hedberg 166809fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 16691aeb9c65SJohan Hedberg 16708f502f84SJohan Hedberg hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 16718f502f84SJohan Hedberg 1672a69d8927SMarcel Holtmann if (!hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) { 16731aeb9c65SJohan Hedberg if (hdev->dev_type == HCI_BREDR) 16741aeb9c65SJohan Hedberg mgmt_powered(hdev, 0); 16751aeb9c65SJohan Hedberg } 16761aeb9c65SJohan Hedberg 16771f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 1678d7347f3cSJohan Hedberg hci_pend_le_actions_clear(hdev); 1679f161dd41SJohan Hedberg hci_conn_hash_flush(hdev); 168009fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 16811da177e4SLinus Torvalds 168264dae967SMarcel Holtmann smp_unregister(hdev); 168364dae967SMarcel Holtmann 16841da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_DOWN); 16851da177e4SLinus Torvalds 16861da177e4SLinus Torvalds if (hdev->flush) 16871da177e4SLinus Torvalds hdev->flush(hdev); 16881da177e4SLinus Torvalds 16891da177e4SLinus Torvalds /* Reset device */ 16901da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 16911da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 1692d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_AUTO_OFF) && 1693d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1694a6c511c6SSzymon Janc test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) { 16951da177e4SLinus Torvalds set_bit(HCI_INIT, &hdev->flags); 169601178cd4SJohan Hedberg __hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT); 16971da177e4SLinus Torvalds clear_bit(HCI_INIT, &hdev->flags); 16981da177e4SLinus Torvalds } 16991da177e4SLinus Torvalds 1700c347b765SGustavo F. Padovan /* flush cmd work */ 1701c347b765SGustavo F. Padovan flush_work(&hdev->cmd_work); 17021da177e4SLinus Torvalds 17031da177e4SLinus Torvalds /* Drop queues */ 17041da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 17051da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 17061da177e4SLinus Torvalds skb_queue_purge(&hdev->raw_q); 17071da177e4SLinus Torvalds 17081da177e4SLinus Torvalds /* Drop last sent command */ 17091da177e4SLinus Torvalds if (hdev->sent_cmd) { 171065cc2b49SMarcel Holtmann cancel_delayed_work_sync(&hdev->cmd_timer); 17111da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 17121da177e4SLinus Torvalds hdev->sent_cmd = NULL; 17131da177e4SLinus Torvalds } 17141da177e4SLinus Torvalds 1715e9ca8bf1SMarcel Holtmann clear_bit(HCI_RUNNING, &hdev->flags); 17164a3f95b7SMarcel Holtmann hci_notify(hdev, HCI_DEV_CLOSE); 17174a3f95b7SMarcel Holtmann 17181da177e4SLinus Torvalds /* After this point our queues are empty 17191da177e4SLinus Torvalds * and no tasks are scheduled. */ 17201da177e4SLinus Torvalds hdev->close(hdev); 17211da177e4SLinus Torvalds 172235b973c9SJohan Hedberg /* Clear flags */ 1723fee746b0SMarcel Holtmann hdev->flags &= BIT(HCI_RAW); 1724eacb44dfSMarcel Holtmann hci_dev_clear_volatile_flags(hdev); 172535b973c9SJohan Hedberg 1726ced5c338SAndrei Emeltchenko /* Controller radio is available but is currently powered down */ 1727536619e8SMarcel Holtmann hdev->amp_status = AMP_STATUS_POWERED_DOWN; 1728ced5c338SAndrei Emeltchenko 1729e59fda8dSJohan Hedberg memset(hdev->eir, 0, sizeof(hdev->eir)); 173009b3c3fbSJohan Hedberg memset(hdev->dev_class, 0, sizeof(hdev->dev_class)); 17317a4cd51dSMarcel Holtmann bacpy(&hdev->random_addr, BDADDR_ANY); 1732e59fda8dSJohan Hedberg 17331da177e4SLinus Torvalds hci_req_unlock(hdev); 17341da177e4SLinus Torvalds 17351da177e4SLinus Torvalds hci_dev_put(hdev); 17361da177e4SLinus Torvalds return 0; 17371da177e4SLinus Torvalds } 17381da177e4SLinus Torvalds 17391da177e4SLinus Torvalds int hci_dev_close(__u16 dev) 17401da177e4SLinus Torvalds { 17411da177e4SLinus Torvalds struct hci_dev *hdev; 17421da177e4SLinus Torvalds int err; 17431da177e4SLinus Torvalds 174470f23020SAndrei Emeltchenko hdev = hci_dev_get(dev); 174570f23020SAndrei Emeltchenko if (!hdev) 17461da177e4SLinus Torvalds return -ENODEV; 17478ee56540SMarcel Holtmann 1748d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 17490736cfa8SMarcel Holtmann err = -EBUSY; 17500736cfa8SMarcel Holtmann goto done; 17510736cfa8SMarcel Holtmann } 17520736cfa8SMarcel Holtmann 1753a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) 17548ee56540SMarcel Holtmann cancel_delayed_work(&hdev->power_off); 17558ee56540SMarcel Holtmann 17561da177e4SLinus Torvalds err = hci_dev_do_close(hdev); 17578ee56540SMarcel Holtmann 17580736cfa8SMarcel Holtmann done: 17591da177e4SLinus Torvalds hci_dev_put(hdev); 17601da177e4SLinus Torvalds return err; 17611da177e4SLinus Torvalds } 17621da177e4SLinus Torvalds 17635c912495SMarcel Holtmann static int hci_dev_do_reset(struct hci_dev *hdev) 17641da177e4SLinus Torvalds { 17655c912495SMarcel Holtmann int ret; 17661da177e4SLinus Torvalds 17675c912495SMarcel Holtmann BT_DBG("%s %p", hdev->name, hdev); 17681da177e4SLinus Torvalds 17691da177e4SLinus Torvalds hci_req_lock(hdev); 17701da177e4SLinus Torvalds 17711da177e4SLinus Torvalds /* Drop queues */ 17721da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 17731da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 17741da177e4SLinus Torvalds 177576727c02SJohan Hedberg /* Avoid potential lockdep warnings from the *_flush() calls by 177676727c02SJohan Hedberg * ensuring the workqueue is empty up front. 177776727c02SJohan Hedberg */ 177876727c02SJohan Hedberg drain_workqueue(hdev->workqueue); 177976727c02SJohan Hedberg 178009fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 17811f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 17821da177e4SLinus Torvalds hci_conn_hash_flush(hdev); 178309fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 17841da177e4SLinus Torvalds 17851da177e4SLinus Torvalds if (hdev->flush) 17861da177e4SLinus Torvalds hdev->flush(hdev); 17871da177e4SLinus Torvalds 17881da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 17896ed58ec5SVille Tervo hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0; 17901da177e4SLinus Torvalds 179101178cd4SJohan Hedberg ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT); 17921da177e4SLinus Torvalds 17931da177e4SLinus Torvalds hci_req_unlock(hdev); 17941da177e4SLinus Torvalds return ret; 17951da177e4SLinus Torvalds } 17961da177e4SLinus Torvalds 17975c912495SMarcel Holtmann int hci_dev_reset(__u16 dev) 17985c912495SMarcel Holtmann { 17995c912495SMarcel Holtmann struct hci_dev *hdev; 18005c912495SMarcel Holtmann int err; 18015c912495SMarcel Holtmann 18025c912495SMarcel Holtmann hdev = hci_dev_get(dev); 18035c912495SMarcel Holtmann if (!hdev) 18045c912495SMarcel Holtmann return -ENODEV; 18055c912495SMarcel Holtmann 18065c912495SMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) { 18075c912495SMarcel Holtmann err = -ENETDOWN; 18085c912495SMarcel Holtmann goto done; 18095c912495SMarcel Holtmann } 18105c912495SMarcel Holtmann 1811d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 18125c912495SMarcel Holtmann err = -EBUSY; 18135c912495SMarcel Holtmann goto done; 18145c912495SMarcel Holtmann } 18155c912495SMarcel Holtmann 1816d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 18175c912495SMarcel Holtmann err = -EOPNOTSUPP; 18185c912495SMarcel Holtmann goto done; 18195c912495SMarcel Holtmann } 18205c912495SMarcel Holtmann 18215c912495SMarcel Holtmann err = hci_dev_do_reset(hdev); 18225c912495SMarcel Holtmann 18235c912495SMarcel Holtmann done: 18245c912495SMarcel Holtmann hci_dev_put(hdev); 18255c912495SMarcel Holtmann return err; 18265c912495SMarcel Holtmann } 18275c912495SMarcel Holtmann 18281da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev) 18291da177e4SLinus Torvalds { 18301da177e4SLinus Torvalds struct hci_dev *hdev; 18311da177e4SLinus Torvalds int ret = 0; 18321da177e4SLinus Torvalds 183370f23020SAndrei Emeltchenko hdev = hci_dev_get(dev); 183470f23020SAndrei Emeltchenko if (!hdev) 18351da177e4SLinus Torvalds return -ENODEV; 18361da177e4SLinus Torvalds 1837d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 18380736cfa8SMarcel Holtmann ret = -EBUSY; 18390736cfa8SMarcel Holtmann goto done; 18400736cfa8SMarcel Holtmann } 18410736cfa8SMarcel Holtmann 1842d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1843fee746b0SMarcel Holtmann ret = -EOPNOTSUPP; 1844fee746b0SMarcel Holtmann goto done; 1845fee746b0SMarcel Holtmann } 1846fee746b0SMarcel Holtmann 18471da177e4SLinus Torvalds memset(&hdev->stat, 0, sizeof(struct hci_dev_stats)); 18481da177e4SLinus Torvalds 18490736cfa8SMarcel Holtmann done: 18501da177e4SLinus Torvalds hci_dev_put(hdev); 18511da177e4SLinus Torvalds return ret; 18521da177e4SLinus Torvalds } 18531da177e4SLinus Torvalds 1854123abc08SJohan Hedberg static void hci_update_scan_state(struct hci_dev *hdev, u8 scan) 1855123abc08SJohan Hedberg { 1856bc6d2d04SJohan Hedberg bool conn_changed, discov_changed; 1857123abc08SJohan Hedberg 1858123abc08SJohan Hedberg BT_DBG("%s scan 0x%02x", hdev->name, scan); 1859123abc08SJohan Hedberg 1860123abc08SJohan Hedberg if ((scan & SCAN_PAGE)) 1861238be788SMarcel Holtmann conn_changed = !hci_dev_test_and_set_flag(hdev, 1862238be788SMarcel Holtmann HCI_CONNECTABLE); 1863123abc08SJohan Hedberg else 1864a69d8927SMarcel Holtmann conn_changed = hci_dev_test_and_clear_flag(hdev, 1865a69d8927SMarcel Holtmann HCI_CONNECTABLE); 1866123abc08SJohan Hedberg 1867bc6d2d04SJohan Hedberg if ((scan & SCAN_INQUIRY)) { 1868238be788SMarcel Holtmann discov_changed = !hci_dev_test_and_set_flag(hdev, 1869238be788SMarcel Holtmann HCI_DISCOVERABLE); 1870bc6d2d04SJohan Hedberg } else { 1871a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); 1872a69d8927SMarcel Holtmann discov_changed = hci_dev_test_and_clear_flag(hdev, 1873a69d8927SMarcel Holtmann HCI_DISCOVERABLE); 1874bc6d2d04SJohan Hedberg } 1875bc6d2d04SJohan Hedberg 1876d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_MGMT)) 1877123abc08SJohan Hedberg return; 1878123abc08SJohan Hedberg 1879bc6d2d04SJohan Hedberg if (conn_changed || discov_changed) { 1880bc6d2d04SJohan Hedberg /* In case this was disabled through mgmt */ 1881a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); 1882bc6d2d04SJohan Hedberg 1883d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) 1884bc6d2d04SJohan Hedberg mgmt_update_adv_data(hdev); 1885bc6d2d04SJohan Hedberg 1886123abc08SJohan Hedberg mgmt_new_settings(hdev); 1887123abc08SJohan Hedberg } 1888bc6d2d04SJohan Hedberg } 1889123abc08SJohan Hedberg 18901da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg) 18911da177e4SLinus Torvalds { 18921da177e4SLinus Torvalds struct hci_dev *hdev; 18931da177e4SLinus Torvalds struct hci_dev_req dr; 18941da177e4SLinus Torvalds int err = 0; 18951da177e4SLinus Torvalds 18961da177e4SLinus Torvalds if (copy_from_user(&dr, arg, sizeof(dr))) 18971da177e4SLinus Torvalds return -EFAULT; 18981da177e4SLinus Torvalds 189970f23020SAndrei Emeltchenko hdev = hci_dev_get(dr.dev_id); 190070f23020SAndrei Emeltchenko if (!hdev) 19011da177e4SLinus Torvalds return -ENODEV; 19021da177e4SLinus Torvalds 1903d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 19040736cfa8SMarcel Holtmann err = -EBUSY; 19050736cfa8SMarcel Holtmann goto done; 19060736cfa8SMarcel Holtmann } 19070736cfa8SMarcel Holtmann 1908d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1909fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1910fee746b0SMarcel Holtmann goto done; 1911fee746b0SMarcel Holtmann } 1912fee746b0SMarcel Holtmann 19135b69bef5SMarcel Holtmann if (hdev->dev_type != HCI_BREDR) { 19145b69bef5SMarcel Holtmann err = -EOPNOTSUPP; 19155b69bef5SMarcel Holtmann goto done; 19165b69bef5SMarcel Holtmann } 19175b69bef5SMarcel Holtmann 1918d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { 191956f87901SJohan Hedberg err = -EOPNOTSUPP; 192056f87901SJohan Hedberg goto done; 192156f87901SJohan Hedberg } 192256f87901SJohan Hedberg 19231da177e4SLinus Torvalds switch (cmd) { 19241da177e4SLinus Torvalds case HCISETAUTH: 192501178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt, 19265f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 19271da177e4SLinus Torvalds break; 19281da177e4SLinus Torvalds 19291da177e4SLinus Torvalds case HCISETENCRYPT: 19301da177e4SLinus Torvalds if (!lmp_encrypt_capable(hdev)) { 19311da177e4SLinus Torvalds err = -EOPNOTSUPP; 19321da177e4SLinus Torvalds break; 19331da177e4SLinus Torvalds } 19341da177e4SLinus Torvalds 19351da177e4SLinus Torvalds if (!test_bit(HCI_AUTH, &hdev->flags)) { 19361da177e4SLinus Torvalds /* Auth must be enabled first */ 193701178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt, 19385f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 19391da177e4SLinus Torvalds if (err) 19401da177e4SLinus Torvalds break; 19411da177e4SLinus Torvalds } 19421da177e4SLinus Torvalds 194301178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt, 19445f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 19451da177e4SLinus Torvalds break; 19461da177e4SLinus Torvalds 19471da177e4SLinus Torvalds case HCISETSCAN: 194801178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt, 19495f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 195091a668b0SJohan Hedberg 1951bc6d2d04SJohan Hedberg /* Ensure that the connectable and discoverable states 1952bc6d2d04SJohan Hedberg * get correctly modified as this was a non-mgmt change. 195391a668b0SJohan Hedberg */ 1954123abc08SJohan Hedberg if (!err) 1955123abc08SJohan Hedberg hci_update_scan_state(hdev, dr.dev_opt); 19561da177e4SLinus Torvalds break; 19571da177e4SLinus Torvalds 19581da177e4SLinus Torvalds case HCISETLINKPOL: 195901178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt, 19605f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 19611da177e4SLinus Torvalds break; 19621da177e4SLinus Torvalds 19631da177e4SLinus Torvalds case HCISETLINKMODE: 1964e4e8e37cSMarcel Holtmann hdev->link_mode = ((__u16) dr.dev_opt) & 1965e4e8e37cSMarcel Holtmann (HCI_LM_MASTER | HCI_LM_ACCEPT); 1966e4e8e37cSMarcel Holtmann break; 1967e4e8e37cSMarcel Holtmann 1968e4e8e37cSMarcel Holtmann case HCISETPTYPE: 1969e4e8e37cSMarcel Holtmann hdev->pkt_type = (__u16) dr.dev_opt; 19701da177e4SLinus Torvalds break; 19711da177e4SLinus Torvalds 19721da177e4SLinus Torvalds case HCISETACLMTU: 19731da177e4SLinus Torvalds hdev->acl_mtu = *((__u16 *) &dr.dev_opt + 1); 19741da177e4SLinus Torvalds hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0); 19751da177e4SLinus Torvalds break; 19761da177e4SLinus Torvalds 19771da177e4SLinus Torvalds case HCISETSCOMTU: 19781da177e4SLinus Torvalds hdev->sco_mtu = *((__u16 *) &dr.dev_opt + 1); 19791da177e4SLinus Torvalds hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0); 19801da177e4SLinus Torvalds break; 19811da177e4SLinus Torvalds 19821da177e4SLinus Torvalds default: 19831da177e4SLinus Torvalds err = -EINVAL; 19841da177e4SLinus Torvalds break; 19851da177e4SLinus Torvalds } 1986e4e8e37cSMarcel Holtmann 19870736cfa8SMarcel Holtmann done: 19881da177e4SLinus Torvalds hci_dev_put(hdev); 19891da177e4SLinus Torvalds return err; 19901da177e4SLinus Torvalds } 19911da177e4SLinus Torvalds 19921da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg) 19931da177e4SLinus Torvalds { 19948035ded4SLuiz Augusto von Dentz struct hci_dev *hdev; 19951da177e4SLinus Torvalds struct hci_dev_list_req *dl; 19961da177e4SLinus Torvalds struct hci_dev_req *dr; 19971da177e4SLinus Torvalds int n = 0, size, err; 19981da177e4SLinus Torvalds __u16 dev_num; 19991da177e4SLinus Torvalds 20001da177e4SLinus Torvalds if (get_user(dev_num, (__u16 __user *) arg)) 20011da177e4SLinus Torvalds return -EFAULT; 20021da177e4SLinus Torvalds 20031da177e4SLinus Torvalds if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr)) 20041da177e4SLinus Torvalds return -EINVAL; 20051da177e4SLinus Torvalds 20061da177e4SLinus Torvalds size = sizeof(*dl) + dev_num * sizeof(*dr); 20071da177e4SLinus Torvalds 200870f23020SAndrei Emeltchenko dl = kzalloc(size, GFP_KERNEL); 200970f23020SAndrei Emeltchenko if (!dl) 20101da177e4SLinus Torvalds return -ENOMEM; 20111da177e4SLinus Torvalds 20121da177e4SLinus Torvalds dr = dl->dev_req; 20131da177e4SLinus Torvalds 2014f20d09d5SGustavo F. Padovan read_lock(&hci_dev_list_lock); 20158035ded4SLuiz Augusto von Dentz list_for_each_entry(hdev, &hci_dev_list, list) { 20162e84d8dbSMarcel Holtmann unsigned long flags = hdev->flags; 2017c542a06cSJohan Hedberg 20182e84d8dbSMarcel Holtmann /* When the auto-off is configured it means the transport 20192e84d8dbSMarcel Holtmann * is running, but in that case still indicate that the 20202e84d8dbSMarcel Holtmann * device is actually down. 20212e84d8dbSMarcel Holtmann */ 2022d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) 20232e84d8dbSMarcel Holtmann flags &= ~BIT(HCI_UP); 2024c542a06cSJohan Hedberg 20251da177e4SLinus Torvalds (dr + n)->dev_id = hdev->id; 20262e84d8dbSMarcel Holtmann (dr + n)->dev_opt = flags; 2027c542a06cSJohan Hedberg 20281da177e4SLinus Torvalds if (++n >= dev_num) 20291da177e4SLinus Torvalds break; 20301da177e4SLinus Torvalds } 2031f20d09d5SGustavo F. Padovan read_unlock(&hci_dev_list_lock); 20321da177e4SLinus Torvalds 20331da177e4SLinus Torvalds dl->dev_num = n; 20341da177e4SLinus Torvalds size = sizeof(*dl) + n * sizeof(*dr); 20351da177e4SLinus Torvalds 20361da177e4SLinus Torvalds err = copy_to_user(arg, dl, size); 20371da177e4SLinus Torvalds kfree(dl); 20381da177e4SLinus Torvalds 20391da177e4SLinus Torvalds return err ? -EFAULT : 0; 20401da177e4SLinus Torvalds } 20411da177e4SLinus Torvalds 20421da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg) 20431da177e4SLinus Torvalds { 20441da177e4SLinus Torvalds struct hci_dev *hdev; 20451da177e4SLinus Torvalds struct hci_dev_info di; 20462e84d8dbSMarcel Holtmann unsigned long flags; 20471da177e4SLinus Torvalds int err = 0; 20481da177e4SLinus Torvalds 20491da177e4SLinus Torvalds if (copy_from_user(&di, arg, sizeof(di))) 20501da177e4SLinus Torvalds return -EFAULT; 20511da177e4SLinus Torvalds 205270f23020SAndrei Emeltchenko hdev = hci_dev_get(di.dev_id); 205370f23020SAndrei Emeltchenko if (!hdev) 20541da177e4SLinus Torvalds return -ENODEV; 20551da177e4SLinus Torvalds 20562e84d8dbSMarcel Holtmann /* When the auto-off is configured it means the transport 20572e84d8dbSMarcel Holtmann * is running, but in that case still indicate that the 20582e84d8dbSMarcel Holtmann * device is actually down. 20592e84d8dbSMarcel Holtmann */ 2060d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) 20612e84d8dbSMarcel Holtmann flags = hdev->flags & ~BIT(HCI_UP); 20622e84d8dbSMarcel Holtmann else 20632e84d8dbSMarcel Holtmann flags = hdev->flags; 2064c542a06cSJohan Hedberg 20651da177e4SLinus Torvalds strcpy(di.name, hdev->name); 20661da177e4SLinus Torvalds di.bdaddr = hdev->bdaddr; 206760f2a3edSMarcel Holtmann di.type = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4); 20682e84d8dbSMarcel Holtmann di.flags = flags; 20691da177e4SLinus Torvalds di.pkt_type = hdev->pkt_type; 2070572c7f84SJohan Hedberg if (lmp_bredr_capable(hdev)) { 20711da177e4SLinus Torvalds di.acl_mtu = hdev->acl_mtu; 20721da177e4SLinus Torvalds di.acl_pkts = hdev->acl_pkts; 20731da177e4SLinus Torvalds di.sco_mtu = hdev->sco_mtu; 20741da177e4SLinus Torvalds di.sco_pkts = hdev->sco_pkts; 2075572c7f84SJohan Hedberg } else { 2076572c7f84SJohan Hedberg di.acl_mtu = hdev->le_mtu; 2077572c7f84SJohan Hedberg di.acl_pkts = hdev->le_pkts; 2078572c7f84SJohan Hedberg di.sco_mtu = 0; 2079572c7f84SJohan Hedberg di.sco_pkts = 0; 2080572c7f84SJohan Hedberg } 20811da177e4SLinus Torvalds di.link_policy = hdev->link_policy; 20821da177e4SLinus Torvalds di.link_mode = hdev->link_mode; 20831da177e4SLinus Torvalds 20841da177e4SLinus Torvalds memcpy(&di.stat, &hdev->stat, sizeof(di.stat)); 20851da177e4SLinus Torvalds memcpy(&di.features, &hdev->features, sizeof(di.features)); 20861da177e4SLinus Torvalds 20871da177e4SLinus Torvalds if (copy_to_user(arg, &di, sizeof(di))) 20881da177e4SLinus Torvalds err = -EFAULT; 20891da177e4SLinus Torvalds 20901da177e4SLinus Torvalds hci_dev_put(hdev); 20911da177e4SLinus Torvalds 20921da177e4SLinus Torvalds return err; 20931da177e4SLinus Torvalds } 20941da177e4SLinus Torvalds 20951da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */ 20961da177e4SLinus Torvalds 2097611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked) 2098611b30f7SMarcel Holtmann { 2099611b30f7SMarcel Holtmann struct hci_dev *hdev = data; 2100611b30f7SMarcel Holtmann 2101611b30f7SMarcel Holtmann BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked); 2102611b30f7SMarcel Holtmann 2103d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) 21040736cfa8SMarcel Holtmann return -EBUSY; 21050736cfa8SMarcel Holtmann 21065e130367SJohan Hedberg if (blocked) { 2107a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RFKILLED); 2108d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 2109d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) 2110611b30f7SMarcel Holtmann hci_dev_do_close(hdev); 21115e130367SJohan Hedberg } else { 2112a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_RFKILLED); 21135e130367SJohan Hedberg } 2114611b30f7SMarcel Holtmann 2115611b30f7SMarcel Holtmann return 0; 2116611b30f7SMarcel Holtmann } 2117611b30f7SMarcel Holtmann 2118611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = { 2119611b30f7SMarcel Holtmann .set_block = hci_rfkill_set_block, 2120611b30f7SMarcel Holtmann }; 2121611b30f7SMarcel Holtmann 2122ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work) 2123ab81cbf9SJohan Hedberg { 2124ab81cbf9SJohan Hedberg struct hci_dev *hdev = container_of(work, struct hci_dev, power_on); 212596570ffcSJohan Hedberg int err; 2126ab81cbf9SJohan Hedberg 2127ab81cbf9SJohan Hedberg BT_DBG("%s", hdev->name); 2128ab81cbf9SJohan Hedberg 2129cbed0ca1SJohan Hedberg err = hci_dev_do_open(hdev); 213096570ffcSJohan Hedberg if (err < 0) { 21313ad67582SJaganath Kanakkassery hci_dev_lock(hdev); 213296570ffcSJohan Hedberg mgmt_set_powered_failed(hdev, err); 21333ad67582SJaganath Kanakkassery hci_dev_unlock(hdev); 2134ab81cbf9SJohan Hedberg return; 213596570ffcSJohan Hedberg } 2136ab81cbf9SJohan Hedberg 2137a5c8f270SMarcel Holtmann /* During the HCI setup phase, a few error conditions are 2138a5c8f270SMarcel Holtmann * ignored and they need to be checked now. If they are still 2139a5c8f270SMarcel Holtmann * valid, it is important to turn the device back off. 2140a5c8f270SMarcel Holtmann */ 2141d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_RFKILLED) || 2142d7a5a11dSMarcel Holtmann hci_dev_test_flag(hdev, HCI_UNCONFIGURED) || 2143a5c8f270SMarcel Holtmann (hdev->dev_type == HCI_BREDR && 2144a5c8f270SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) && 2145a5c8f270SMarcel Holtmann !bacmp(&hdev->static_addr, BDADDR_ANY))) { 2146a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_AUTO_OFF); 2147bf543036SJohan Hedberg hci_dev_do_close(hdev); 2148d7a5a11dSMarcel Holtmann } else if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) { 214919202573SJohan Hedberg queue_delayed_work(hdev->req_workqueue, &hdev->power_off, 215019202573SJohan Hedberg HCI_AUTO_OFF_TIMEOUT); 2151bf543036SJohan Hedberg } 2152ab81cbf9SJohan Hedberg 2153a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_SETUP)) { 21544a964404SMarcel Holtmann /* For unconfigured devices, set the HCI_RAW flag 21554a964404SMarcel Holtmann * so that userspace can easily identify them. 21564a964404SMarcel Holtmann */ 2157d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 21584a964404SMarcel Holtmann set_bit(HCI_RAW, &hdev->flags); 21590602a8adSMarcel Holtmann 21600602a8adSMarcel Holtmann /* For fully configured devices, this will send 21610602a8adSMarcel Holtmann * the Index Added event. For unconfigured devices, 21620602a8adSMarcel Holtmann * it will send Unconfigued Index Added event. 21630602a8adSMarcel Holtmann * 21640602a8adSMarcel Holtmann * Devices with HCI_QUIRK_RAW_DEVICE are ignored 21650602a8adSMarcel Holtmann * and no event will be send. 21660602a8adSMarcel Holtmann */ 2167744cf19eSJohan Hedberg mgmt_index_added(hdev); 2168a69d8927SMarcel Holtmann } else if (hci_dev_test_and_clear_flag(hdev, HCI_CONFIG)) { 21695ea234d3SMarcel Holtmann /* When the controller is now configured, then it 21705ea234d3SMarcel Holtmann * is important to clear the HCI_RAW flag. 21715ea234d3SMarcel Holtmann */ 2172d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 21735ea234d3SMarcel Holtmann clear_bit(HCI_RAW, &hdev->flags); 21745ea234d3SMarcel Holtmann 2175d603b76bSMarcel Holtmann /* Powering on the controller with HCI_CONFIG set only 2176d603b76bSMarcel Holtmann * happens with the transition from unconfigured to 2177d603b76bSMarcel Holtmann * configured. This will send the Index Added event. 2178d603b76bSMarcel Holtmann */ 2179d603b76bSMarcel Holtmann mgmt_index_added(hdev); 2180ab81cbf9SJohan Hedberg } 2181ab81cbf9SJohan Hedberg } 2182ab81cbf9SJohan Hedberg 2183ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work) 2184ab81cbf9SJohan Hedberg { 21853243553fSJohan Hedberg struct hci_dev *hdev = container_of(work, struct hci_dev, 21863243553fSJohan Hedberg power_off.work); 2187ab81cbf9SJohan Hedberg 2188ab81cbf9SJohan Hedberg BT_DBG("%s", hdev->name); 2189ab81cbf9SJohan Hedberg 21908ee56540SMarcel Holtmann hci_dev_do_close(hdev); 2191ab81cbf9SJohan Hedberg } 2192ab81cbf9SJohan Hedberg 2193c7741d16SMarcel Holtmann static void hci_error_reset(struct work_struct *work) 2194c7741d16SMarcel Holtmann { 2195c7741d16SMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, error_reset); 2196c7741d16SMarcel Holtmann 2197c7741d16SMarcel Holtmann BT_DBG("%s", hdev->name); 2198c7741d16SMarcel Holtmann 2199c7741d16SMarcel Holtmann if (hdev->hw_error) 2200c7741d16SMarcel Holtmann hdev->hw_error(hdev, hdev->hw_error_code); 2201c7741d16SMarcel Holtmann else 2202c7741d16SMarcel Holtmann BT_ERR("%s hardware error 0x%2.2x", hdev->name, 2203c7741d16SMarcel Holtmann hdev->hw_error_code); 2204c7741d16SMarcel Holtmann 2205c7741d16SMarcel Holtmann if (hci_dev_do_close(hdev)) 2206c7741d16SMarcel Holtmann return; 2207c7741d16SMarcel Holtmann 2208c7741d16SMarcel Holtmann hci_dev_do_open(hdev); 2209c7741d16SMarcel Holtmann } 2210c7741d16SMarcel Holtmann 221116ab91abSJohan Hedberg static void hci_discov_off(struct work_struct *work) 221216ab91abSJohan Hedberg { 221316ab91abSJohan Hedberg struct hci_dev *hdev; 221416ab91abSJohan Hedberg 221516ab91abSJohan Hedberg hdev = container_of(work, struct hci_dev, discov_off.work); 221616ab91abSJohan Hedberg 221716ab91abSJohan Hedberg BT_DBG("%s", hdev->name); 221816ab91abSJohan Hedberg 2219d1967ff8SMarcel Holtmann mgmt_discoverable_timeout(hdev); 222016ab91abSJohan Hedberg } 222116ab91abSJohan Hedberg 22225d900e46SFlorian Grandel static void hci_adv_timeout_expire(struct work_struct *work) 22235d900e46SFlorian Grandel { 22245d900e46SFlorian Grandel struct hci_dev *hdev; 22255d900e46SFlorian Grandel 22265d900e46SFlorian Grandel hdev = container_of(work, struct hci_dev, adv_instance_expire.work); 22275d900e46SFlorian Grandel 22285d900e46SFlorian Grandel BT_DBG("%s", hdev->name); 22295d900e46SFlorian Grandel 22305d900e46SFlorian Grandel mgmt_adv_timeout_expired(hdev); 22315d900e46SFlorian Grandel } 22325d900e46SFlorian Grandel 223335f7498aSJohan Hedberg void hci_uuids_clear(struct hci_dev *hdev) 22342aeb9a1aSJohan Hedberg { 22354821002cSJohan Hedberg struct bt_uuid *uuid, *tmp; 22362aeb9a1aSJohan Hedberg 22374821002cSJohan Hedberg list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) { 22384821002cSJohan Hedberg list_del(&uuid->list); 22392aeb9a1aSJohan Hedberg kfree(uuid); 22402aeb9a1aSJohan Hedberg } 22412aeb9a1aSJohan Hedberg } 22422aeb9a1aSJohan Hedberg 224335f7498aSJohan Hedberg void hci_link_keys_clear(struct hci_dev *hdev) 224455ed8ca1SJohan Hedberg { 224555ed8ca1SJohan Hedberg struct link_key *key; 224655ed8ca1SJohan Hedberg 22470378b597SJohan Hedberg list_for_each_entry_rcu(key, &hdev->link_keys, list) { 22480378b597SJohan Hedberg list_del_rcu(&key->list); 22490378b597SJohan Hedberg kfree_rcu(key, rcu); 225055ed8ca1SJohan Hedberg } 225155ed8ca1SJohan Hedberg } 225255ed8ca1SJohan Hedberg 225335f7498aSJohan Hedberg void hci_smp_ltks_clear(struct hci_dev *hdev) 2254b899efafSVinicius Costa Gomes { 2255970d0f1bSJohan Hedberg struct smp_ltk *k; 2256b899efafSVinicius Costa Gomes 2257970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 2258970d0f1bSJohan Hedberg list_del_rcu(&k->list); 2259970d0f1bSJohan Hedberg kfree_rcu(k, rcu); 2260b899efafSVinicius Costa Gomes } 2261b899efafSVinicius Costa Gomes } 2262b899efafSVinicius Costa Gomes 2263970c4e46SJohan Hedberg void hci_smp_irks_clear(struct hci_dev *hdev) 2264970c4e46SJohan Hedberg { 2265adae20cbSJohan Hedberg struct smp_irk *k; 2266970c4e46SJohan Hedberg 2267adae20cbSJohan Hedberg list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) { 2268adae20cbSJohan Hedberg list_del_rcu(&k->list); 2269adae20cbSJohan Hedberg kfree_rcu(k, rcu); 2270970c4e46SJohan Hedberg } 2271970c4e46SJohan Hedberg } 2272970c4e46SJohan Hedberg 227355ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) 227455ed8ca1SJohan Hedberg { 227555ed8ca1SJohan Hedberg struct link_key *k; 227655ed8ca1SJohan Hedberg 22770378b597SJohan Hedberg rcu_read_lock(); 22780378b597SJohan Hedberg list_for_each_entry_rcu(k, &hdev->link_keys, list) { 22790378b597SJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) == 0) { 22800378b597SJohan Hedberg rcu_read_unlock(); 228155ed8ca1SJohan Hedberg return k; 22820378b597SJohan Hedberg } 22830378b597SJohan Hedberg } 22840378b597SJohan Hedberg rcu_read_unlock(); 228555ed8ca1SJohan Hedberg 228655ed8ca1SJohan Hedberg return NULL; 228755ed8ca1SJohan Hedberg } 228855ed8ca1SJohan Hedberg 2289745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn, 2290d25e28abSJohan Hedberg u8 key_type, u8 old_key_type) 2291d25e28abSJohan Hedberg { 2292d25e28abSJohan Hedberg /* Legacy key */ 2293d25e28abSJohan Hedberg if (key_type < 0x03) 2294745c0ce3SVishal Agarwal return true; 2295d25e28abSJohan Hedberg 2296d25e28abSJohan Hedberg /* Debug keys are insecure so don't store them persistently */ 2297d25e28abSJohan Hedberg if (key_type == HCI_LK_DEBUG_COMBINATION) 2298745c0ce3SVishal Agarwal return false; 2299d25e28abSJohan Hedberg 2300d25e28abSJohan Hedberg /* Changed combination key and there's no previous one */ 2301d25e28abSJohan Hedberg if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff) 2302745c0ce3SVishal Agarwal return false; 2303d25e28abSJohan Hedberg 2304d25e28abSJohan Hedberg /* Security mode 3 case */ 2305d25e28abSJohan Hedberg if (!conn) 2306745c0ce3SVishal Agarwal return true; 2307d25e28abSJohan Hedberg 2308e3befab9SJohan Hedberg /* BR/EDR key derived using SC from an LE link */ 2309e3befab9SJohan Hedberg if (conn->type == LE_LINK) 2310e3befab9SJohan Hedberg return true; 2311e3befab9SJohan Hedberg 2312d25e28abSJohan Hedberg /* Neither local nor remote side had no-bonding as requirement */ 2313d25e28abSJohan Hedberg if (conn->auth_type > 0x01 && conn->remote_auth > 0x01) 2314745c0ce3SVishal Agarwal return true; 2315d25e28abSJohan Hedberg 2316d25e28abSJohan Hedberg /* Local side had dedicated bonding as requirement */ 2317d25e28abSJohan Hedberg if (conn->auth_type == 0x02 || conn->auth_type == 0x03) 2318745c0ce3SVishal Agarwal return true; 2319d25e28abSJohan Hedberg 2320d25e28abSJohan Hedberg /* Remote side had dedicated bonding as requirement */ 2321d25e28abSJohan Hedberg if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03) 2322745c0ce3SVishal Agarwal return true; 2323d25e28abSJohan Hedberg 2324d25e28abSJohan Hedberg /* If none of the above criteria match, then don't store the key 2325d25e28abSJohan Hedberg * persistently */ 2326745c0ce3SVishal Agarwal return false; 2327d25e28abSJohan Hedberg } 2328d25e28abSJohan Hedberg 2329e804d25dSJohan Hedberg static u8 ltk_role(u8 type) 233098a0b845SJohan Hedberg { 2331e804d25dSJohan Hedberg if (type == SMP_LTK) 2332e804d25dSJohan Hedberg return HCI_ROLE_MASTER; 233398a0b845SJohan Hedberg 2334e804d25dSJohan Hedberg return HCI_ROLE_SLAVE; 233598a0b845SJohan Hedberg } 233698a0b845SJohan Hedberg 2337f3a73d97SJohan Hedberg struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, 2338e804d25dSJohan Hedberg u8 addr_type, u8 role) 233975d262c2SVinicius Costa Gomes { 2340c9839a11SVinicius Costa Gomes struct smp_ltk *k; 234175d262c2SVinicius Costa Gomes 2342970d0f1bSJohan Hedberg rcu_read_lock(); 2343970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 23445378bc56SJohan Hedberg if (addr_type != k->bdaddr_type || bacmp(bdaddr, &k->bdaddr)) 23455378bc56SJohan Hedberg continue; 23465378bc56SJohan Hedberg 2347923e2414SJohan Hedberg if (smp_ltk_is_sc(k) || ltk_role(k->type) == role) { 2348970d0f1bSJohan Hedberg rcu_read_unlock(); 234975d262c2SVinicius Costa Gomes return k; 2350970d0f1bSJohan Hedberg } 2351970d0f1bSJohan Hedberg } 2352970d0f1bSJohan Hedberg rcu_read_unlock(); 235375d262c2SVinicius Costa Gomes 235475d262c2SVinicius Costa Gomes return NULL; 235575d262c2SVinicius Costa Gomes } 235675d262c2SVinicius Costa Gomes 2357970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa) 2358970c4e46SJohan Hedberg { 2359970c4e46SJohan Hedberg struct smp_irk *irk; 2360970c4e46SJohan Hedberg 2361adae20cbSJohan Hedberg rcu_read_lock(); 2362adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2363adae20cbSJohan Hedberg if (!bacmp(&irk->rpa, rpa)) { 2364adae20cbSJohan Hedberg rcu_read_unlock(); 2365970c4e46SJohan Hedberg return irk; 2366970c4e46SJohan Hedberg } 2367adae20cbSJohan Hedberg } 2368970c4e46SJohan Hedberg 2369adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2370defce9e8SJohan Hedberg if (smp_irk_matches(hdev, irk->val, rpa)) { 2371970c4e46SJohan Hedberg bacpy(&irk->rpa, rpa); 2372adae20cbSJohan Hedberg rcu_read_unlock(); 2373970c4e46SJohan Hedberg return irk; 2374970c4e46SJohan Hedberg } 2375970c4e46SJohan Hedberg } 2376adae20cbSJohan Hedberg rcu_read_unlock(); 2377970c4e46SJohan Hedberg 2378970c4e46SJohan Hedberg return NULL; 2379970c4e46SJohan Hedberg } 2380970c4e46SJohan Hedberg 2381970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr, 2382970c4e46SJohan Hedberg u8 addr_type) 2383970c4e46SJohan Hedberg { 2384970c4e46SJohan Hedberg struct smp_irk *irk; 2385970c4e46SJohan Hedberg 23866cfc9988SJohan Hedberg /* Identity Address must be public or static random */ 23876cfc9988SJohan Hedberg if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0) 23886cfc9988SJohan Hedberg return NULL; 23896cfc9988SJohan Hedberg 2390adae20cbSJohan Hedberg rcu_read_lock(); 2391adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2392970c4e46SJohan Hedberg if (addr_type == irk->addr_type && 2393adae20cbSJohan Hedberg bacmp(bdaddr, &irk->bdaddr) == 0) { 2394adae20cbSJohan Hedberg rcu_read_unlock(); 2395970c4e46SJohan Hedberg return irk; 2396970c4e46SJohan Hedberg } 2397adae20cbSJohan Hedberg } 2398adae20cbSJohan Hedberg rcu_read_unlock(); 2399970c4e46SJohan Hedberg 2400970c4e46SJohan Hedberg return NULL; 2401970c4e46SJohan Hedberg } 2402970c4e46SJohan Hedberg 2403567fa2aaSJohan Hedberg struct link_key *hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, 24047652ff6aSJohan Hedberg bdaddr_t *bdaddr, u8 *val, u8 type, 24057652ff6aSJohan Hedberg u8 pin_len, bool *persistent) 240655ed8ca1SJohan Hedberg { 240755ed8ca1SJohan Hedberg struct link_key *key, *old_key; 2408745c0ce3SVishal Agarwal u8 old_key_type; 240955ed8ca1SJohan Hedberg 241055ed8ca1SJohan Hedberg old_key = hci_find_link_key(hdev, bdaddr); 241155ed8ca1SJohan Hedberg if (old_key) { 241255ed8ca1SJohan Hedberg old_key_type = old_key->type; 241355ed8ca1SJohan Hedberg key = old_key; 241455ed8ca1SJohan Hedberg } else { 241512adcf3aSJohan Hedberg old_key_type = conn ? conn->key_type : 0xff; 24160a14ab41SJohan Hedberg key = kzalloc(sizeof(*key), GFP_KERNEL); 241755ed8ca1SJohan Hedberg if (!key) 2418567fa2aaSJohan Hedberg return NULL; 24190378b597SJohan Hedberg list_add_rcu(&key->list, &hdev->link_keys); 242055ed8ca1SJohan Hedberg } 242155ed8ca1SJohan Hedberg 24226ed93dc6SAndrei Emeltchenko BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type); 242355ed8ca1SJohan Hedberg 2424d25e28abSJohan Hedberg /* Some buggy controller combinations generate a changed 2425d25e28abSJohan Hedberg * combination key for legacy pairing even when there's no 2426d25e28abSJohan Hedberg * previous key */ 2427d25e28abSJohan Hedberg if (type == HCI_LK_CHANGED_COMBINATION && 2428a8c5fb1aSGustavo Padovan (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) { 2429d25e28abSJohan Hedberg type = HCI_LK_COMBINATION; 2430655fe6ecSJohan Hedberg if (conn) 2431655fe6ecSJohan Hedberg conn->key_type = type; 2432655fe6ecSJohan Hedberg } 2433d25e28abSJohan Hedberg 243455ed8ca1SJohan Hedberg bacpy(&key->bdaddr, bdaddr); 24359b3b4460SAndrei Emeltchenko memcpy(key->val, val, HCI_LINK_KEY_SIZE); 243655ed8ca1SJohan Hedberg key->pin_len = pin_len; 243755ed8ca1SJohan Hedberg 2438b6020ba0SWaldemar Rymarkiewicz if (type == HCI_LK_CHANGED_COMBINATION) 243955ed8ca1SJohan Hedberg key->type = old_key_type; 24404748fed2SJohan Hedberg else 24414748fed2SJohan Hedberg key->type = type; 24424748fed2SJohan Hedberg 24437652ff6aSJohan Hedberg if (persistent) 24447652ff6aSJohan Hedberg *persistent = hci_persistent_key(hdev, conn, type, 24457652ff6aSJohan Hedberg old_key_type); 24464df378a1SJohan Hedberg 2447567fa2aaSJohan Hedberg return key; 244855ed8ca1SJohan Hedberg } 244955ed8ca1SJohan Hedberg 2450ca9142b8SJohan Hedberg struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, 245135d70271SJohan Hedberg u8 addr_type, u8 type, u8 authenticated, 2452fe39c7b2SMarcel Holtmann u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand) 245375d262c2SVinicius Costa Gomes { 2454c9839a11SVinicius Costa Gomes struct smp_ltk *key, *old_key; 2455e804d25dSJohan Hedberg u8 role = ltk_role(type); 245675d262c2SVinicius Costa Gomes 2457f3a73d97SJohan Hedberg old_key = hci_find_ltk(hdev, bdaddr, addr_type, role); 2458c9839a11SVinicius Costa Gomes if (old_key) 245975d262c2SVinicius Costa Gomes key = old_key; 2460c9839a11SVinicius Costa Gomes else { 24610a14ab41SJohan Hedberg key = kzalloc(sizeof(*key), GFP_KERNEL); 246275d262c2SVinicius Costa Gomes if (!key) 2463ca9142b8SJohan Hedberg return NULL; 2464970d0f1bSJohan Hedberg list_add_rcu(&key->list, &hdev->long_term_keys); 246575d262c2SVinicius Costa Gomes } 246675d262c2SVinicius Costa Gomes 246775d262c2SVinicius Costa Gomes bacpy(&key->bdaddr, bdaddr); 2468c9839a11SVinicius Costa Gomes key->bdaddr_type = addr_type; 2469c9839a11SVinicius Costa Gomes memcpy(key->val, tk, sizeof(key->val)); 2470c9839a11SVinicius Costa Gomes key->authenticated = authenticated; 2471c9839a11SVinicius Costa Gomes key->ediv = ediv; 2472fe39c7b2SMarcel Holtmann key->rand = rand; 2473c9839a11SVinicius Costa Gomes key->enc_size = enc_size; 2474c9839a11SVinicius Costa Gomes key->type = type; 247575d262c2SVinicius Costa Gomes 2476ca9142b8SJohan Hedberg return key; 247775d262c2SVinicius Costa Gomes } 247875d262c2SVinicius Costa Gomes 2479ca9142b8SJohan Hedberg struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, 2480ca9142b8SJohan Hedberg u8 addr_type, u8 val[16], bdaddr_t *rpa) 2481970c4e46SJohan Hedberg { 2482970c4e46SJohan Hedberg struct smp_irk *irk; 2483970c4e46SJohan Hedberg 2484970c4e46SJohan Hedberg irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type); 2485970c4e46SJohan Hedberg if (!irk) { 2486970c4e46SJohan Hedberg irk = kzalloc(sizeof(*irk), GFP_KERNEL); 2487970c4e46SJohan Hedberg if (!irk) 2488ca9142b8SJohan Hedberg return NULL; 2489970c4e46SJohan Hedberg 2490970c4e46SJohan Hedberg bacpy(&irk->bdaddr, bdaddr); 2491970c4e46SJohan Hedberg irk->addr_type = addr_type; 2492970c4e46SJohan Hedberg 2493adae20cbSJohan Hedberg list_add_rcu(&irk->list, &hdev->identity_resolving_keys); 2494970c4e46SJohan Hedberg } 2495970c4e46SJohan Hedberg 2496970c4e46SJohan Hedberg memcpy(irk->val, val, 16); 2497970c4e46SJohan Hedberg bacpy(&irk->rpa, rpa); 2498970c4e46SJohan Hedberg 2499ca9142b8SJohan Hedberg return irk; 2500970c4e46SJohan Hedberg } 2501970c4e46SJohan Hedberg 250255ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) 250355ed8ca1SJohan Hedberg { 250455ed8ca1SJohan Hedberg struct link_key *key; 250555ed8ca1SJohan Hedberg 250655ed8ca1SJohan Hedberg key = hci_find_link_key(hdev, bdaddr); 250755ed8ca1SJohan Hedberg if (!key) 250855ed8ca1SJohan Hedberg return -ENOENT; 250955ed8ca1SJohan Hedberg 25106ed93dc6SAndrei Emeltchenko BT_DBG("%s removing %pMR", hdev->name, bdaddr); 251155ed8ca1SJohan Hedberg 25120378b597SJohan Hedberg list_del_rcu(&key->list); 25130378b597SJohan Hedberg kfree_rcu(key, rcu); 251455ed8ca1SJohan Hedberg 251555ed8ca1SJohan Hedberg return 0; 251655ed8ca1SJohan Hedberg } 251755ed8ca1SJohan Hedberg 2518e0b2b27eSJohan Hedberg int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type) 2519b899efafSVinicius Costa Gomes { 2520970d0f1bSJohan Hedberg struct smp_ltk *k; 2521c51ffa0bSJohan Hedberg int removed = 0; 2522b899efafSVinicius Costa Gomes 2523970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 2524e0b2b27eSJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type) 2525b899efafSVinicius Costa Gomes continue; 2526b899efafSVinicius Costa Gomes 25276ed93dc6SAndrei Emeltchenko BT_DBG("%s removing %pMR", hdev->name, bdaddr); 2528b899efafSVinicius Costa Gomes 2529970d0f1bSJohan Hedberg list_del_rcu(&k->list); 2530970d0f1bSJohan Hedberg kfree_rcu(k, rcu); 2531c51ffa0bSJohan Hedberg removed++; 2532b899efafSVinicius Costa Gomes } 2533b899efafSVinicius Costa Gomes 2534c51ffa0bSJohan Hedberg return removed ? 0 : -ENOENT; 2535b899efafSVinicius Costa Gomes } 2536b899efafSVinicius Costa Gomes 2537a7ec7338SJohan Hedberg void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type) 2538a7ec7338SJohan Hedberg { 2539adae20cbSJohan Hedberg struct smp_irk *k; 2540a7ec7338SJohan Hedberg 2541adae20cbSJohan Hedberg list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) { 2542a7ec7338SJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type) 2543a7ec7338SJohan Hedberg continue; 2544a7ec7338SJohan Hedberg 2545a7ec7338SJohan Hedberg BT_DBG("%s removing %pMR", hdev->name, bdaddr); 2546a7ec7338SJohan Hedberg 2547adae20cbSJohan Hedberg list_del_rcu(&k->list); 2548adae20cbSJohan Hedberg kfree_rcu(k, rcu); 2549a7ec7338SJohan Hedberg } 2550a7ec7338SJohan Hedberg } 2551a7ec7338SJohan Hedberg 255255e76b38SJohan Hedberg bool hci_bdaddr_is_paired(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) 255355e76b38SJohan Hedberg { 255455e76b38SJohan Hedberg struct smp_ltk *k; 25554ba9faf3SJohan Hedberg struct smp_irk *irk; 255655e76b38SJohan Hedberg u8 addr_type; 255755e76b38SJohan Hedberg 255855e76b38SJohan Hedberg if (type == BDADDR_BREDR) { 255955e76b38SJohan Hedberg if (hci_find_link_key(hdev, bdaddr)) 256055e76b38SJohan Hedberg return true; 256155e76b38SJohan Hedberg return false; 256255e76b38SJohan Hedberg } 256355e76b38SJohan Hedberg 256455e76b38SJohan Hedberg /* Convert to HCI addr type which struct smp_ltk uses */ 256555e76b38SJohan Hedberg if (type == BDADDR_LE_PUBLIC) 256655e76b38SJohan Hedberg addr_type = ADDR_LE_DEV_PUBLIC; 256755e76b38SJohan Hedberg else 256855e76b38SJohan Hedberg addr_type = ADDR_LE_DEV_RANDOM; 256955e76b38SJohan Hedberg 25704ba9faf3SJohan Hedberg irk = hci_get_irk(hdev, bdaddr, addr_type); 25714ba9faf3SJohan Hedberg if (irk) { 25724ba9faf3SJohan Hedberg bdaddr = &irk->bdaddr; 25734ba9faf3SJohan Hedberg addr_type = irk->addr_type; 25744ba9faf3SJohan Hedberg } 25754ba9faf3SJohan Hedberg 257655e76b38SJohan Hedberg rcu_read_lock(); 257755e76b38SJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 257887c8b28dSJohan Hedberg if (k->bdaddr_type == addr_type && !bacmp(bdaddr, &k->bdaddr)) { 257987c8b28dSJohan Hedberg rcu_read_unlock(); 258055e76b38SJohan Hedberg return true; 258155e76b38SJohan Hedberg } 258287c8b28dSJohan Hedberg } 258355e76b38SJohan Hedberg rcu_read_unlock(); 258455e76b38SJohan Hedberg 258555e76b38SJohan Hedberg return false; 258655e76b38SJohan Hedberg } 258755e76b38SJohan Hedberg 25886bd32326SVille Tervo /* HCI command timer function */ 258965cc2b49SMarcel Holtmann static void hci_cmd_timeout(struct work_struct *work) 25906bd32326SVille Tervo { 259165cc2b49SMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, 259265cc2b49SMarcel Holtmann cmd_timer.work); 25936bd32326SVille Tervo 2594bda4f23aSAndrei Emeltchenko if (hdev->sent_cmd) { 2595bda4f23aSAndrei Emeltchenko struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data; 2596bda4f23aSAndrei Emeltchenko u16 opcode = __le16_to_cpu(sent->opcode); 2597bda4f23aSAndrei Emeltchenko 2598bda4f23aSAndrei Emeltchenko BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode); 2599bda4f23aSAndrei Emeltchenko } else { 26006bd32326SVille Tervo BT_ERR("%s command tx timeout", hdev->name); 2601bda4f23aSAndrei Emeltchenko } 2602bda4f23aSAndrei Emeltchenko 26036bd32326SVille Tervo atomic_set(&hdev->cmd_cnt, 1); 2604c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 26056bd32326SVille Tervo } 26066bd32326SVille Tervo 26072763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev, 26086928a924SJohan Hedberg bdaddr_t *bdaddr, u8 bdaddr_type) 26092763eda6SSzymon Janc { 26102763eda6SSzymon Janc struct oob_data *data; 26112763eda6SSzymon Janc 26126928a924SJohan Hedberg list_for_each_entry(data, &hdev->remote_oob_data, list) { 26136928a924SJohan Hedberg if (bacmp(bdaddr, &data->bdaddr) != 0) 26146928a924SJohan Hedberg continue; 26156928a924SJohan Hedberg if (data->bdaddr_type != bdaddr_type) 26166928a924SJohan Hedberg continue; 26172763eda6SSzymon Janc return data; 26186928a924SJohan Hedberg } 26192763eda6SSzymon Janc 26202763eda6SSzymon Janc return NULL; 26212763eda6SSzymon Janc } 26222763eda6SSzymon Janc 26236928a924SJohan Hedberg int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, 26246928a924SJohan Hedberg u8 bdaddr_type) 26252763eda6SSzymon Janc { 26262763eda6SSzymon Janc struct oob_data *data; 26272763eda6SSzymon Janc 26286928a924SJohan Hedberg data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type); 26292763eda6SSzymon Janc if (!data) 26302763eda6SSzymon Janc return -ENOENT; 26312763eda6SSzymon Janc 26326928a924SJohan Hedberg BT_DBG("%s removing %pMR (%u)", hdev->name, bdaddr, bdaddr_type); 26332763eda6SSzymon Janc 26342763eda6SSzymon Janc list_del(&data->list); 26352763eda6SSzymon Janc kfree(data); 26362763eda6SSzymon Janc 26372763eda6SSzymon Janc return 0; 26382763eda6SSzymon Janc } 26392763eda6SSzymon Janc 264035f7498aSJohan Hedberg void hci_remote_oob_data_clear(struct hci_dev *hdev) 26412763eda6SSzymon Janc { 26422763eda6SSzymon Janc struct oob_data *data, *n; 26432763eda6SSzymon Janc 26442763eda6SSzymon Janc list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) { 26452763eda6SSzymon Janc list_del(&data->list); 26462763eda6SSzymon Janc kfree(data); 26472763eda6SSzymon Janc } 26482763eda6SSzymon Janc } 26492763eda6SSzymon Janc 26500798872eSMarcel Holtmann int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, 26516928a924SJohan Hedberg u8 bdaddr_type, u8 *hash192, u8 *rand192, 265238da1703SJohan Hedberg u8 *hash256, u8 *rand256) 26530798872eSMarcel Holtmann { 26540798872eSMarcel Holtmann struct oob_data *data; 26550798872eSMarcel Holtmann 26566928a924SJohan Hedberg data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type); 26570798872eSMarcel Holtmann if (!data) { 26580a14ab41SJohan Hedberg data = kmalloc(sizeof(*data), GFP_KERNEL); 26590798872eSMarcel Holtmann if (!data) 26600798872eSMarcel Holtmann return -ENOMEM; 26610798872eSMarcel Holtmann 26620798872eSMarcel Holtmann bacpy(&data->bdaddr, bdaddr); 26636928a924SJohan Hedberg data->bdaddr_type = bdaddr_type; 26640798872eSMarcel Holtmann list_add(&data->list, &hdev->remote_oob_data); 26650798872eSMarcel Holtmann } 26660798872eSMarcel Holtmann 266781328d5cSJohan Hedberg if (hash192 && rand192) { 26680798872eSMarcel Holtmann memcpy(data->hash192, hash192, sizeof(data->hash192)); 266938da1703SJohan Hedberg memcpy(data->rand192, rand192, sizeof(data->rand192)); 2670f7697b16SMarcel Holtmann if (hash256 && rand256) 2671f7697b16SMarcel Holtmann data->present = 0x03; 267281328d5cSJohan Hedberg } else { 267381328d5cSJohan Hedberg memset(data->hash192, 0, sizeof(data->hash192)); 267481328d5cSJohan Hedberg memset(data->rand192, 0, sizeof(data->rand192)); 2675f7697b16SMarcel Holtmann if (hash256 && rand256) 2676f7697b16SMarcel Holtmann data->present = 0x02; 2677f7697b16SMarcel Holtmann else 2678f7697b16SMarcel Holtmann data->present = 0x00; 267981328d5cSJohan Hedberg } 26800798872eSMarcel Holtmann 268181328d5cSJohan Hedberg if (hash256 && rand256) { 26820798872eSMarcel Holtmann memcpy(data->hash256, hash256, sizeof(data->hash256)); 268338da1703SJohan Hedberg memcpy(data->rand256, rand256, sizeof(data->rand256)); 268481328d5cSJohan Hedberg } else { 268581328d5cSJohan Hedberg memset(data->hash256, 0, sizeof(data->hash256)); 268681328d5cSJohan Hedberg memset(data->rand256, 0, sizeof(data->rand256)); 2687f7697b16SMarcel Holtmann if (hash192 && rand192) 2688f7697b16SMarcel Holtmann data->present = 0x01; 268981328d5cSJohan Hedberg } 26900798872eSMarcel Holtmann 26916ed93dc6SAndrei Emeltchenko BT_DBG("%s for %pMR", hdev->name, bdaddr); 26922763eda6SSzymon Janc 26932763eda6SSzymon Janc return 0; 26942763eda6SSzymon Janc } 26952763eda6SSzymon Janc 2696d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2697d2609b34SFlorian Grandel struct adv_info *hci_find_adv_instance(struct hci_dev *hdev, u8 instance) 2698d2609b34SFlorian Grandel { 2699d2609b34SFlorian Grandel struct adv_info *adv_instance; 2700d2609b34SFlorian Grandel 2701d2609b34SFlorian Grandel list_for_each_entry(adv_instance, &hdev->adv_instances, list) { 2702d2609b34SFlorian Grandel if (adv_instance->instance == instance) 2703d2609b34SFlorian Grandel return adv_instance; 2704d2609b34SFlorian Grandel } 2705d2609b34SFlorian Grandel 2706d2609b34SFlorian Grandel return NULL; 2707d2609b34SFlorian Grandel } 2708d2609b34SFlorian Grandel 2709d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2710d2609b34SFlorian Grandel struct adv_info *hci_get_next_instance(struct hci_dev *hdev, u8 instance) { 2711d2609b34SFlorian Grandel struct adv_info *cur_instance; 2712d2609b34SFlorian Grandel 2713d2609b34SFlorian Grandel cur_instance = hci_find_adv_instance(hdev, instance); 2714d2609b34SFlorian Grandel if (!cur_instance) 2715d2609b34SFlorian Grandel return NULL; 2716d2609b34SFlorian Grandel 2717d2609b34SFlorian Grandel if (cur_instance == list_last_entry(&hdev->adv_instances, 2718d2609b34SFlorian Grandel struct adv_info, list)) 2719d2609b34SFlorian Grandel return list_first_entry(&hdev->adv_instances, 2720d2609b34SFlorian Grandel struct adv_info, list); 2721d2609b34SFlorian Grandel else 2722d2609b34SFlorian Grandel return list_next_entry(cur_instance, list); 2723d2609b34SFlorian Grandel } 2724d2609b34SFlorian Grandel 2725d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2726d2609b34SFlorian Grandel int hci_remove_adv_instance(struct hci_dev *hdev, u8 instance) 2727d2609b34SFlorian Grandel { 2728d2609b34SFlorian Grandel struct adv_info *adv_instance; 2729d2609b34SFlorian Grandel 2730d2609b34SFlorian Grandel adv_instance = hci_find_adv_instance(hdev, instance); 2731d2609b34SFlorian Grandel if (!adv_instance) 2732d2609b34SFlorian Grandel return -ENOENT; 2733d2609b34SFlorian Grandel 2734d2609b34SFlorian Grandel BT_DBG("%s removing %dMR", hdev->name, instance); 2735d2609b34SFlorian Grandel 27365d900e46SFlorian Grandel if (hdev->cur_adv_instance == instance && hdev->adv_instance_timeout) { 27375d900e46SFlorian Grandel cancel_delayed_work(&hdev->adv_instance_expire); 27385d900e46SFlorian Grandel hdev->adv_instance_timeout = 0; 27395d900e46SFlorian Grandel } 27405d900e46SFlorian Grandel 2741d2609b34SFlorian Grandel list_del(&adv_instance->list); 2742d2609b34SFlorian Grandel kfree(adv_instance); 2743d2609b34SFlorian Grandel 2744d2609b34SFlorian Grandel hdev->adv_instance_cnt--; 2745d2609b34SFlorian Grandel 2746d2609b34SFlorian Grandel return 0; 2747d2609b34SFlorian Grandel } 2748d2609b34SFlorian Grandel 2749d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2750d2609b34SFlorian Grandel void hci_adv_instances_clear(struct hci_dev *hdev) 2751d2609b34SFlorian Grandel { 2752d2609b34SFlorian Grandel struct adv_info *adv_instance, *n; 2753d2609b34SFlorian Grandel 27545d900e46SFlorian Grandel if (hdev->adv_instance_timeout) { 27555d900e46SFlorian Grandel cancel_delayed_work(&hdev->adv_instance_expire); 27565d900e46SFlorian Grandel hdev->adv_instance_timeout = 0; 27575d900e46SFlorian Grandel } 27585d900e46SFlorian Grandel 2759d2609b34SFlorian Grandel list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) { 2760d2609b34SFlorian Grandel list_del(&adv_instance->list); 2761d2609b34SFlorian Grandel kfree(adv_instance); 2762d2609b34SFlorian Grandel } 2763d2609b34SFlorian Grandel 2764d2609b34SFlorian Grandel hdev->adv_instance_cnt = 0; 2765d2609b34SFlorian Grandel } 2766d2609b34SFlorian Grandel 2767d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2768d2609b34SFlorian Grandel int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags, 2769d2609b34SFlorian Grandel u16 adv_data_len, u8 *adv_data, 2770d2609b34SFlorian Grandel u16 scan_rsp_len, u8 *scan_rsp_data, 2771d2609b34SFlorian Grandel u16 timeout, u16 duration) 2772d2609b34SFlorian Grandel { 2773d2609b34SFlorian Grandel struct adv_info *adv_instance; 2774d2609b34SFlorian Grandel 2775d2609b34SFlorian Grandel adv_instance = hci_find_adv_instance(hdev, instance); 2776d2609b34SFlorian Grandel if (adv_instance) { 2777d2609b34SFlorian Grandel memset(adv_instance->adv_data, 0, 2778d2609b34SFlorian Grandel sizeof(adv_instance->adv_data)); 2779d2609b34SFlorian Grandel memset(adv_instance->scan_rsp_data, 0, 2780d2609b34SFlorian Grandel sizeof(adv_instance->scan_rsp_data)); 2781d2609b34SFlorian Grandel } else { 2782d2609b34SFlorian Grandel if (hdev->adv_instance_cnt >= HCI_MAX_ADV_INSTANCES || 2783d2609b34SFlorian Grandel instance < 1 || instance > HCI_MAX_ADV_INSTANCES) 2784d2609b34SFlorian Grandel return -EOVERFLOW; 2785d2609b34SFlorian Grandel 278639ecfad6SJohan Hedberg adv_instance = kzalloc(sizeof(*adv_instance), GFP_KERNEL); 2787d2609b34SFlorian Grandel if (!adv_instance) 2788d2609b34SFlorian Grandel return -ENOMEM; 2789d2609b34SFlorian Grandel 2790fffd38bcSFlorian Grandel adv_instance->pending = true; 2791d2609b34SFlorian Grandel adv_instance->instance = instance; 2792d2609b34SFlorian Grandel list_add(&adv_instance->list, &hdev->adv_instances); 2793d2609b34SFlorian Grandel hdev->adv_instance_cnt++; 2794d2609b34SFlorian Grandel } 2795d2609b34SFlorian Grandel 2796d2609b34SFlorian Grandel adv_instance->flags = flags; 2797d2609b34SFlorian Grandel adv_instance->adv_data_len = adv_data_len; 2798d2609b34SFlorian Grandel adv_instance->scan_rsp_len = scan_rsp_len; 2799d2609b34SFlorian Grandel 2800d2609b34SFlorian Grandel if (adv_data_len) 2801d2609b34SFlorian Grandel memcpy(adv_instance->adv_data, adv_data, adv_data_len); 2802d2609b34SFlorian Grandel 2803d2609b34SFlorian Grandel if (scan_rsp_len) 2804d2609b34SFlorian Grandel memcpy(adv_instance->scan_rsp_data, 2805d2609b34SFlorian Grandel scan_rsp_data, scan_rsp_len); 2806d2609b34SFlorian Grandel 2807d2609b34SFlorian Grandel adv_instance->timeout = timeout; 28085d900e46SFlorian Grandel adv_instance->remaining_time = timeout; 2809d2609b34SFlorian Grandel 2810d2609b34SFlorian Grandel if (duration == 0) 2811d2609b34SFlorian Grandel adv_instance->duration = HCI_DEFAULT_ADV_DURATION; 2812d2609b34SFlorian Grandel else 2813d2609b34SFlorian Grandel adv_instance->duration = duration; 2814d2609b34SFlorian Grandel 2815d2609b34SFlorian Grandel BT_DBG("%s for %dMR", hdev->name, instance); 2816d2609b34SFlorian Grandel 2817d2609b34SFlorian Grandel return 0; 2818d2609b34SFlorian Grandel } 2819d2609b34SFlorian Grandel 2820dcc36c16SJohan Hedberg struct bdaddr_list *hci_bdaddr_list_lookup(struct list_head *bdaddr_list, 2821b9ee0a78SMarcel Holtmann bdaddr_t *bdaddr, u8 type) 2822b2a66aadSAntti Julku { 2823b2a66aadSAntti Julku struct bdaddr_list *b; 2824b2a66aadSAntti Julku 2825dcc36c16SJohan Hedberg list_for_each_entry(b, bdaddr_list, list) { 2826b9ee0a78SMarcel Holtmann if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type) 2827b2a66aadSAntti Julku return b; 2828b9ee0a78SMarcel Holtmann } 2829b2a66aadSAntti Julku 2830b2a66aadSAntti Julku return NULL; 2831b2a66aadSAntti Julku } 2832b2a66aadSAntti Julku 2833dcc36c16SJohan Hedberg void hci_bdaddr_list_clear(struct list_head *bdaddr_list) 2834b2a66aadSAntti Julku { 2835b2a66aadSAntti Julku struct list_head *p, *n; 2836b2a66aadSAntti Julku 2837dcc36c16SJohan Hedberg list_for_each_safe(p, n, bdaddr_list) { 2838b9ee0a78SMarcel Holtmann struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list); 2839b2a66aadSAntti Julku 2840b2a66aadSAntti Julku list_del(p); 2841b2a66aadSAntti Julku kfree(b); 2842b2a66aadSAntti Julku } 2843b2a66aadSAntti Julku } 2844b2a66aadSAntti Julku 2845dcc36c16SJohan Hedberg int hci_bdaddr_list_add(struct list_head *list, bdaddr_t *bdaddr, u8 type) 2846b2a66aadSAntti Julku { 2847b2a66aadSAntti Julku struct bdaddr_list *entry; 2848b2a66aadSAntti Julku 2849b9ee0a78SMarcel Holtmann if (!bacmp(bdaddr, BDADDR_ANY)) 2850b2a66aadSAntti Julku return -EBADF; 2851b2a66aadSAntti Julku 2852dcc36c16SJohan Hedberg if (hci_bdaddr_list_lookup(list, bdaddr, type)) 28535e762444SAntti Julku return -EEXIST; 2854b2a66aadSAntti Julku 285527f70f3eSJohan Hedberg entry = kzalloc(sizeof(*entry), GFP_KERNEL); 28565e762444SAntti Julku if (!entry) 28575e762444SAntti Julku return -ENOMEM; 2858b2a66aadSAntti Julku 2859b2a66aadSAntti Julku bacpy(&entry->bdaddr, bdaddr); 2860b9ee0a78SMarcel Holtmann entry->bdaddr_type = type; 2861b2a66aadSAntti Julku 2862dcc36c16SJohan Hedberg list_add(&entry->list, list); 2863b2a66aadSAntti Julku 28642a8357f2SJohan Hedberg return 0; 2865b2a66aadSAntti Julku } 2866b2a66aadSAntti Julku 2867dcc36c16SJohan Hedberg int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, u8 type) 2868b2a66aadSAntti Julku { 2869b2a66aadSAntti Julku struct bdaddr_list *entry; 2870b2a66aadSAntti Julku 287135f7498aSJohan Hedberg if (!bacmp(bdaddr, BDADDR_ANY)) { 2872dcc36c16SJohan Hedberg hci_bdaddr_list_clear(list); 287335f7498aSJohan Hedberg return 0; 287435f7498aSJohan Hedberg } 2875b2a66aadSAntti Julku 2876dcc36c16SJohan Hedberg entry = hci_bdaddr_list_lookup(list, bdaddr, type); 2877d2ab0ac1SMarcel Holtmann if (!entry) 2878d2ab0ac1SMarcel Holtmann return -ENOENT; 2879d2ab0ac1SMarcel Holtmann 2880d2ab0ac1SMarcel Holtmann list_del(&entry->list); 2881d2ab0ac1SMarcel Holtmann kfree(entry); 2882d2ab0ac1SMarcel Holtmann 2883d2ab0ac1SMarcel Holtmann return 0; 2884d2ab0ac1SMarcel Holtmann } 2885d2ab0ac1SMarcel Holtmann 288615819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 288715819a70SAndre Guedes struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, 288815819a70SAndre Guedes bdaddr_t *addr, u8 addr_type) 288915819a70SAndre Guedes { 289015819a70SAndre Guedes struct hci_conn_params *params; 289115819a70SAndre Guedes 289215819a70SAndre Guedes list_for_each_entry(params, &hdev->le_conn_params, list) { 289315819a70SAndre Guedes if (bacmp(¶ms->addr, addr) == 0 && 289415819a70SAndre Guedes params->addr_type == addr_type) { 289515819a70SAndre Guedes return params; 289615819a70SAndre Guedes } 289715819a70SAndre Guedes } 289815819a70SAndre Guedes 289915819a70SAndre Guedes return NULL; 290015819a70SAndre Guedes } 290115819a70SAndre Guedes 290215819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 2903501f8827SJohan Hedberg struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list, 29044b10966fSMarcel Holtmann bdaddr_t *addr, u8 addr_type) 290515819a70SAndre Guedes { 2906912b42efSJohan Hedberg struct hci_conn_params *param; 290715819a70SAndre Guedes 2908501f8827SJohan Hedberg list_for_each_entry(param, list, action) { 2909912b42efSJohan Hedberg if (bacmp(¶m->addr, addr) == 0 && 2910912b42efSJohan Hedberg param->addr_type == addr_type) 2911912b42efSJohan Hedberg return param; 29124b10966fSMarcel Holtmann } 29134b10966fSMarcel Holtmann 29144b10966fSMarcel Holtmann return NULL; 291515819a70SAndre Guedes } 291615819a70SAndre Guedes 291715819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 2918f75113a2SJakub Pawlowski struct hci_conn_params *hci_explicit_connect_lookup(struct hci_dev *hdev, 2919f75113a2SJakub Pawlowski bdaddr_t *addr, 2920f75113a2SJakub Pawlowski u8 addr_type) 2921f75113a2SJakub Pawlowski { 2922f75113a2SJakub Pawlowski struct hci_conn_params *param; 2923f75113a2SJakub Pawlowski 2924f75113a2SJakub Pawlowski list_for_each_entry(param, &hdev->pend_le_conns, action) { 2925f75113a2SJakub Pawlowski if (bacmp(¶m->addr, addr) == 0 && 2926f75113a2SJakub Pawlowski param->addr_type == addr_type && 2927f75113a2SJakub Pawlowski param->explicit_connect) 2928f75113a2SJakub Pawlowski return param; 2929f75113a2SJakub Pawlowski } 2930f75113a2SJakub Pawlowski 2931f75113a2SJakub Pawlowski list_for_each_entry(param, &hdev->pend_le_reports, action) { 2932f75113a2SJakub Pawlowski if (bacmp(¶m->addr, addr) == 0 && 2933f75113a2SJakub Pawlowski param->addr_type == addr_type && 2934f75113a2SJakub Pawlowski param->explicit_connect) 2935f75113a2SJakub Pawlowski return param; 2936f75113a2SJakub Pawlowski } 2937f75113a2SJakub Pawlowski 2938f75113a2SJakub Pawlowski return NULL; 2939f75113a2SJakub Pawlowski } 2940f75113a2SJakub Pawlowski 2941f75113a2SJakub Pawlowski /* This function requires the caller holds hdev->lock */ 294251d167c0SMarcel Holtmann struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev, 294351d167c0SMarcel Holtmann bdaddr_t *addr, u8 addr_type) 294415819a70SAndre Guedes { 294515819a70SAndre Guedes struct hci_conn_params *params; 294615819a70SAndre Guedes 294715819a70SAndre Guedes params = hci_conn_params_lookup(hdev, addr, addr_type); 2948cef952ceSAndre Guedes if (params) 294951d167c0SMarcel Holtmann return params; 295015819a70SAndre Guedes 295115819a70SAndre Guedes params = kzalloc(sizeof(*params), GFP_KERNEL); 295215819a70SAndre Guedes if (!params) { 295315819a70SAndre Guedes BT_ERR("Out of memory"); 295451d167c0SMarcel Holtmann return NULL; 295515819a70SAndre Guedes } 295615819a70SAndre Guedes 295715819a70SAndre Guedes bacpy(¶ms->addr, addr); 295815819a70SAndre Guedes params->addr_type = addr_type; 2959cef952ceSAndre Guedes 2960cef952ceSAndre Guedes list_add(¶ms->list, &hdev->le_conn_params); 296193450c75SJohan Hedberg INIT_LIST_HEAD(¶ms->action); 2962cef952ceSAndre Guedes 2963bf5b3c8bSMarcel Holtmann params->conn_min_interval = hdev->le_conn_min_interval; 2964bf5b3c8bSMarcel Holtmann params->conn_max_interval = hdev->le_conn_max_interval; 2965bf5b3c8bSMarcel Holtmann params->conn_latency = hdev->le_conn_latency; 2966bf5b3c8bSMarcel Holtmann params->supervision_timeout = hdev->le_supv_timeout; 2967bf5b3c8bSMarcel Holtmann params->auto_connect = HCI_AUTO_CONN_DISABLED; 2968bf5b3c8bSMarcel Holtmann 2969bf5b3c8bSMarcel Holtmann BT_DBG("addr %pMR (type %u)", addr, addr_type); 2970bf5b3c8bSMarcel Holtmann 297151d167c0SMarcel Holtmann return params; 2972bf5b3c8bSMarcel Holtmann } 2973bf5b3c8bSMarcel Holtmann 2974f6c63249SJohan Hedberg static void hci_conn_params_free(struct hci_conn_params *params) 2975f6c63249SJohan Hedberg { 2976f6c63249SJohan Hedberg if (params->conn) { 2977f6c63249SJohan Hedberg hci_conn_drop(params->conn); 2978f6c63249SJohan Hedberg hci_conn_put(params->conn); 2979f6c63249SJohan Hedberg } 2980f6c63249SJohan Hedberg 2981f6c63249SJohan Hedberg list_del(¶ms->action); 2982f6c63249SJohan Hedberg list_del(¶ms->list); 2983f6c63249SJohan Hedberg kfree(params); 2984f6c63249SJohan Hedberg } 2985f6c63249SJohan Hedberg 298615819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 298715819a70SAndre Guedes void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type) 298815819a70SAndre Guedes { 298915819a70SAndre Guedes struct hci_conn_params *params; 299015819a70SAndre Guedes 299115819a70SAndre Guedes params = hci_conn_params_lookup(hdev, addr, addr_type); 299215819a70SAndre Guedes if (!params) 299315819a70SAndre Guedes return; 299415819a70SAndre Guedes 2995f6c63249SJohan Hedberg hci_conn_params_free(params); 299615819a70SAndre Guedes 299795305baaSJohan Hedberg hci_update_background_scan(hdev); 299895305baaSJohan Hedberg 299915819a70SAndre Guedes BT_DBG("addr %pMR (type %u)", addr, addr_type); 300015819a70SAndre Guedes } 300115819a70SAndre Guedes 300215819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 300355af49a8SJohan Hedberg void hci_conn_params_clear_disabled(struct hci_dev *hdev) 300415819a70SAndre Guedes { 300515819a70SAndre Guedes struct hci_conn_params *params, *tmp; 300615819a70SAndre Guedes 300715819a70SAndre Guedes list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) { 300855af49a8SJohan Hedberg if (params->auto_connect != HCI_AUTO_CONN_DISABLED) 300955af49a8SJohan Hedberg continue; 3010f75113a2SJakub Pawlowski 3011f75113a2SJakub Pawlowski /* If trying to estabilish one time connection to disabled 3012f75113a2SJakub Pawlowski * device, leave the params, but mark them as just once. 3013f75113a2SJakub Pawlowski */ 3014f75113a2SJakub Pawlowski if (params->explicit_connect) { 3015f75113a2SJakub Pawlowski params->auto_connect = HCI_AUTO_CONN_EXPLICIT; 3016f75113a2SJakub Pawlowski continue; 3017f75113a2SJakub Pawlowski } 3018f75113a2SJakub Pawlowski 301915819a70SAndre Guedes list_del(¶ms->list); 302015819a70SAndre Guedes kfree(params); 302115819a70SAndre Guedes } 302215819a70SAndre Guedes 302355af49a8SJohan Hedberg BT_DBG("All LE disabled connection parameters were removed"); 302455af49a8SJohan Hedberg } 302555af49a8SJohan Hedberg 302655af49a8SJohan Hedberg /* This function requires the caller holds hdev->lock */ 3027373110c5SJohan Hedberg void hci_conn_params_clear_all(struct hci_dev *hdev) 302815819a70SAndre Guedes { 302915819a70SAndre Guedes struct hci_conn_params *params, *tmp; 303015819a70SAndre Guedes 3031f6c63249SJohan Hedberg list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) 3032f6c63249SJohan Hedberg hci_conn_params_free(params); 303315819a70SAndre Guedes 3034a2f41a8fSJohan Hedberg hci_update_background_scan(hdev); 30351089b67dSMarcel Holtmann 303615819a70SAndre Guedes BT_DBG("All LE connection parameters were removed"); 303715819a70SAndre Guedes } 303815819a70SAndre Guedes 30391904a853SMarcel Holtmann static void inquiry_complete(struct hci_dev *hdev, u8 status, u16 opcode) 30407ba8b4beSAndre Guedes { 30414c87eaabSAndre Guedes if (status) { 30424c87eaabSAndre Guedes BT_ERR("Failed to start inquiry: status %d", status); 30437ba8b4beSAndre Guedes 30444c87eaabSAndre Guedes hci_dev_lock(hdev); 30454c87eaabSAndre Guedes hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 30464c87eaabSAndre Guedes hci_dev_unlock(hdev); 30474c87eaabSAndre Guedes return; 30484c87eaabSAndre Guedes } 30497ba8b4beSAndre Guedes } 30507ba8b4beSAndre Guedes 30511904a853SMarcel Holtmann static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status, 30521904a853SMarcel Holtmann u16 opcode) 30537ba8b4beSAndre Guedes { 30544c87eaabSAndre Guedes /* General inquiry access code (GIAC) */ 30554c87eaabSAndre Guedes u8 lap[3] = { 0x33, 0x8b, 0x9e }; 30564c87eaabSAndre Guedes struct hci_cp_inquiry cp; 30577ba8b4beSAndre Guedes int err; 30587ba8b4beSAndre Guedes 30594c87eaabSAndre Guedes if (status) { 30604c87eaabSAndre Guedes BT_ERR("Failed to disable LE scanning: status %d", status); 30614c87eaabSAndre Guedes return; 30627ba8b4beSAndre Guedes } 30637ba8b4beSAndre Guedes 30642d28cfe7SJakub Pawlowski hdev->discovery.scan_start = 0; 30652d28cfe7SJakub Pawlowski 30664c87eaabSAndre Guedes switch (hdev->discovery.type) { 30674c87eaabSAndre Guedes case DISCOV_TYPE_LE: 30684c87eaabSAndre Guedes hci_dev_lock(hdev); 30694c87eaabSAndre Guedes hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 30704c87eaabSAndre Guedes hci_dev_unlock(hdev); 30714c87eaabSAndre Guedes break; 30727dbfac1dSAndre Guedes 30734c87eaabSAndre Guedes case DISCOV_TYPE_INTERLEAVED: 30744c87eaabSAndre Guedes hci_dev_lock(hdev); 30754c87eaabSAndre Guedes 307607d2334aSJakub Pawlowski if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, 307707d2334aSJakub Pawlowski &hdev->quirks)) { 307807d2334aSJakub Pawlowski /* If we were running LE only scan, change discovery 307907d2334aSJakub Pawlowski * state. If we were running both LE and BR/EDR inquiry 308007d2334aSJakub Pawlowski * simultaneously, and BR/EDR inquiry is already 308107d2334aSJakub Pawlowski * finished, stop discovery, otherwise BR/EDR inquiry 3082177d0506SWesley Kuo * will stop discovery when finished. If we will resolve 3083177d0506SWesley Kuo * remote device name, do not change discovery state. 308407d2334aSJakub Pawlowski */ 3085177d0506SWesley Kuo if (!test_bit(HCI_INQUIRY, &hdev->flags) && 3086177d0506SWesley Kuo hdev->discovery.state != DISCOVERY_RESOLVING) 308707d2334aSJakub Pawlowski hci_discovery_set_state(hdev, 308807d2334aSJakub Pawlowski DISCOVERY_STOPPED); 308907d2334aSJakub Pawlowski } else { 3090baf880a9SJohan Hedberg struct hci_request req; 3091baf880a9SJohan Hedberg 30924c87eaabSAndre Guedes hci_inquiry_cache_flush(hdev); 30934c87eaabSAndre Guedes 3094baf880a9SJohan Hedberg hci_req_init(&req, hdev); 3095baf880a9SJohan Hedberg 3096baf880a9SJohan Hedberg memset(&cp, 0, sizeof(cp)); 3097baf880a9SJohan Hedberg memcpy(&cp.lap, lap, sizeof(cp.lap)); 3098baf880a9SJohan Hedberg cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN; 3099baf880a9SJohan Hedberg hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp); 3100baf880a9SJohan Hedberg 31014c87eaabSAndre Guedes err = hci_req_run(&req, inquiry_complete); 31024c87eaabSAndre Guedes if (err) { 31034c87eaabSAndre Guedes BT_ERR("Inquiry request failed: err %d", err); 310407d2334aSJakub Pawlowski hci_discovery_set_state(hdev, 310507d2334aSJakub Pawlowski DISCOVERY_STOPPED); 310607d2334aSJakub Pawlowski } 31077dbfac1dSAndre Guedes } 31087dbfac1dSAndre Guedes 31094c87eaabSAndre Guedes hci_dev_unlock(hdev); 31104c87eaabSAndre Guedes break; 31114c87eaabSAndre Guedes } 31127dbfac1dSAndre Guedes } 31137dbfac1dSAndre Guedes 31147ba8b4beSAndre Guedes static void le_scan_disable_work(struct work_struct *work) 31157ba8b4beSAndre Guedes { 31167ba8b4beSAndre Guedes struct hci_dev *hdev = container_of(work, struct hci_dev, 31177ba8b4beSAndre Guedes le_scan_disable.work); 31184c87eaabSAndre Guedes struct hci_request req; 31194c87eaabSAndre Guedes int err; 31207ba8b4beSAndre Guedes 31217ba8b4beSAndre Guedes BT_DBG("%s", hdev->name); 31227ba8b4beSAndre Guedes 31232d28cfe7SJakub Pawlowski cancel_delayed_work_sync(&hdev->le_scan_restart); 31242d28cfe7SJakub Pawlowski 31254c87eaabSAndre Guedes hci_req_init(&req, hdev); 31267ba8b4beSAndre Guedes 3127b1efcc28SAndre Guedes hci_req_add_le_scan_disable(&req); 31287ba8b4beSAndre Guedes 31294c87eaabSAndre Guedes err = hci_req_run(&req, le_scan_disable_work_complete); 31304c87eaabSAndre Guedes if (err) 31314c87eaabSAndre Guedes BT_ERR("Disable LE scanning request failed: err %d", err); 313228b75a89SAndre Guedes } 313328b75a89SAndre Guedes 31342d28cfe7SJakub Pawlowski static void le_scan_restart_work_complete(struct hci_dev *hdev, u8 status, 31352d28cfe7SJakub Pawlowski u16 opcode) 31362d28cfe7SJakub Pawlowski { 31372d28cfe7SJakub Pawlowski unsigned long timeout, duration, scan_start, now; 31382d28cfe7SJakub Pawlowski 31392d28cfe7SJakub Pawlowski BT_DBG("%s", hdev->name); 31402d28cfe7SJakub Pawlowski 31412d28cfe7SJakub Pawlowski if (status) { 31422d28cfe7SJakub Pawlowski BT_ERR("Failed to restart LE scan: status %d", status); 31432d28cfe7SJakub Pawlowski return; 31442d28cfe7SJakub Pawlowski } 31452d28cfe7SJakub Pawlowski 31462d28cfe7SJakub Pawlowski if (!test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks) || 31472d28cfe7SJakub Pawlowski !hdev->discovery.scan_start) 31482d28cfe7SJakub Pawlowski return; 31492d28cfe7SJakub Pawlowski 31502d28cfe7SJakub Pawlowski /* When the scan was started, hdev->le_scan_disable has been queued 31512d28cfe7SJakub Pawlowski * after duration from scan_start. During scan restart this job 31522d28cfe7SJakub Pawlowski * has been canceled, and we need to queue it again after proper 31532d28cfe7SJakub Pawlowski * timeout, to make sure that scan does not run indefinitely. 31542d28cfe7SJakub Pawlowski */ 31552d28cfe7SJakub Pawlowski duration = hdev->discovery.scan_duration; 31562d28cfe7SJakub Pawlowski scan_start = hdev->discovery.scan_start; 31572d28cfe7SJakub Pawlowski now = jiffies; 31582d28cfe7SJakub Pawlowski if (now - scan_start <= duration) { 31592d28cfe7SJakub Pawlowski int elapsed; 31602d28cfe7SJakub Pawlowski 31612d28cfe7SJakub Pawlowski if (now >= scan_start) 31622d28cfe7SJakub Pawlowski elapsed = now - scan_start; 31632d28cfe7SJakub Pawlowski else 31642d28cfe7SJakub Pawlowski elapsed = ULONG_MAX - scan_start + now; 31652d28cfe7SJakub Pawlowski 31662d28cfe7SJakub Pawlowski timeout = duration - elapsed; 31672d28cfe7SJakub Pawlowski } else { 31682d28cfe7SJakub Pawlowski timeout = 0; 31692d28cfe7SJakub Pawlowski } 31702d28cfe7SJakub Pawlowski queue_delayed_work(hdev->workqueue, 31712d28cfe7SJakub Pawlowski &hdev->le_scan_disable, timeout); 31722d28cfe7SJakub Pawlowski } 31732d28cfe7SJakub Pawlowski 31742d28cfe7SJakub Pawlowski static void le_scan_restart_work(struct work_struct *work) 31752d28cfe7SJakub Pawlowski { 31762d28cfe7SJakub Pawlowski struct hci_dev *hdev = container_of(work, struct hci_dev, 31772d28cfe7SJakub Pawlowski le_scan_restart.work); 31782d28cfe7SJakub Pawlowski struct hci_request req; 31792d28cfe7SJakub Pawlowski struct hci_cp_le_set_scan_enable cp; 31802d28cfe7SJakub Pawlowski int err; 31812d28cfe7SJakub Pawlowski 31822d28cfe7SJakub Pawlowski BT_DBG("%s", hdev->name); 31832d28cfe7SJakub Pawlowski 31842d28cfe7SJakub Pawlowski /* If controller is not scanning we are done. */ 3185d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_LE_SCAN)) 31862d28cfe7SJakub Pawlowski return; 31872d28cfe7SJakub Pawlowski 31882d28cfe7SJakub Pawlowski hci_req_init(&req, hdev); 31892d28cfe7SJakub Pawlowski 31902d28cfe7SJakub Pawlowski hci_req_add_le_scan_disable(&req); 31912d28cfe7SJakub Pawlowski 31922d28cfe7SJakub Pawlowski memset(&cp, 0, sizeof(cp)); 31932d28cfe7SJakub Pawlowski cp.enable = LE_SCAN_ENABLE; 31942d28cfe7SJakub Pawlowski cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE; 31952d28cfe7SJakub Pawlowski hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp); 31962d28cfe7SJakub Pawlowski 31972d28cfe7SJakub Pawlowski err = hci_req_run(&req, le_scan_restart_work_complete); 31982d28cfe7SJakub Pawlowski if (err) 31992d28cfe7SJakub Pawlowski BT_ERR("Restart LE scan request failed: err %d", err); 32002d28cfe7SJakub Pawlowski } 32012d28cfe7SJakub Pawlowski 3202a1f4c318SJohan Hedberg /* Copy the Identity Address of the controller. 3203a1f4c318SJohan Hedberg * 3204a1f4c318SJohan Hedberg * If the controller has a public BD_ADDR, then by default use that one. 3205a1f4c318SJohan Hedberg * If this is a LE only controller without a public address, default to 3206a1f4c318SJohan Hedberg * the static random address. 3207a1f4c318SJohan Hedberg * 3208a1f4c318SJohan Hedberg * For debugging purposes it is possible to force controllers with a 3209a1f4c318SJohan Hedberg * public address to use the static random address instead. 321050b5b952SMarcel Holtmann * 321150b5b952SMarcel Holtmann * In case BR/EDR has been disabled on a dual-mode controller and 321250b5b952SMarcel Holtmann * userspace has configured a static address, then that address 321350b5b952SMarcel Holtmann * becomes the identity address instead of the public BR/EDR address. 3214a1f4c318SJohan Hedberg */ 3215a1f4c318SJohan Hedberg void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, 3216a1f4c318SJohan Hedberg u8 *bdaddr_type) 3217a1f4c318SJohan Hedberg { 3218b7cb93e5SMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || 321950b5b952SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) || 3220d7a5a11dSMarcel Holtmann (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && 322150b5b952SMarcel Holtmann bacmp(&hdev->static_addr, BDADDR_ANY))) { 3222a1f4c318SJohan Hedberg bacpy(bdaddr, &hdev->static_addr); 3223a1f4c318SJohan Hedberg *bdaddr_type = ADDR_LE_DEV_RANDOM; 3224a1f4c318SJohan Hedberg } else { 3225a1f4c318SJohan Hedberg bacpy(bdaddr, &hdev->bdaddr); 3226a1f4c318SJohan Hedberg *bdaddr_type = ADDR_LE_DEV_PUBLIC; 3227a1f4c318SJohan Hedberg } 3228a1f4c318SJohan Hedberg } 3229a1f4c318SJohan Hedberg 32309be0dab7SDavid Herrmann /* Alloc HCI device */ 32319be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void) 32329be0dab7SDavid Herrmann { 32339be0dab7SDavid Herrmann struct hci_dev *hdev; 32349be0dab7SDavid Herrmann 323527f70f3eSJohan Hedberg hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); 32369be0dab7SDavid Herrmann if (!hdev) 32379be0dab7SDavid Herrmann return NULL; 32389be0dab7SDavid Herrmann 3239b1b813d4SDavid Herrmann hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); 3240b1b813d4SDavid Herrmann hdev->esco_type = (ESCO_HV1); 3241b1b813d4SDavid Herrmann hdev->link_mode = (HCI_LM_ACCEPT); 3242b4cb9fb2SMarcel Holtmann hdev->num_iac = 0x01; /* One IAC support is mandatory */ 3243b1b813d4SDavid Herrmann hdev->io_capability = 0x03; /* No Input No Output */ 324496c2103aSMarcel Holtmann hdev->manufacturer = 0xffff; /* Default to internal use */ 3245bbaf444aSJohan Hedberg hdev->inq_tx_power = HCI_TX_POWER_INVALID; 3246bbaf444aSJohan Hedberg hdev->adv_tx_power = HCI_TX_POWER_INVALID; 3247d2609b34SFlorian Grandel hdev->adv_instance_cnt = 0; 3248d2609b34SFlorian Grandel hdev->cur_adv_instance = 0x00; 32495d900e46SFlorian Grandel hdev->adv_instance_timeout = 0; 3250b1b813d4SDavid Herrmann 3251b1b813d4SDavid Herrmann hdev->sniff_max_interval = 800; 3252b1b813d4SDavid Herrmann hdev->sniff_min_interval = 80; 3253b1b813d4SDavid Herrmann 32543f959d46SMarcel Holtmann hdev->le_adv_channel_map = 0x07; 3255628531c9SGeorg Lukas hdev->le_adv_min_interval = 0x0800; 3256628531c9SGeorg Lukas hdev->le_adv_max_interval = 0x0800; 3257bef64738SMarcel Holtmann hdev->le_scan_interval = 0x0060; 3258bef64738SMarcel Holtmann hdev->le_scan_window = 0x0030; 32594e70c7e7SMarcel Holtmann hdev->le_conn_min_interval = 0x0028; 32604e70c7e7SMarcel Holtmann hdev->le_conn_max_interval = 0x0038; 326104fb7d90SMarcel Holtmann hdev->le_conn_latency = 0x0000; 326204fb7d90SMarcel Holtmann hdev->le_supv_timeout = 0x002a; 3263a8e1bfaaSMarcel Holtmann hdev->le_def_tx_len = 0x001b; 3264a8e1bfaaSMarcel Holtmann hdev->le_def_tx_time = 0x0148; 3265a8e1bfaaSMarcel Holtmann hdev->le_max_tx_len = 0x001b; 3266a8e1bfaaSMarcel Holtmann hdev->le_max_tx_time = 0x0148; 3267a8e1bfaaSMarcel Holtmann hdev->le_max_rx_len = 0x001b; 3268a8e1bfaaSMarcel Holtmann hdev->le_max_rx_time = 0x0148; 3269bef64738SMarcel Holtmann 3270d6bfd59cSJohan Hedberg hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT; 3271b9a7a61eSLukasz Rymanowski hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT; 327231ad1691SAndrzej Kaczmarek hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE; 327331ad1691SAndrzej Kaczmarek hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE; 3274d6bfd59cSJohan Hedberg 3275b1b813d4SDavid Herrmann mutex_init(&hdev->lock); 3276b1b813d4SDavid Herrmann mutex_init(&hdev->req_lock); 3277b1b813d4SDavid Herrmann 3278b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->mgmt_pending); 3279b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->blacklist); 32806659358eSJohan Hedberg INIT_LIST_HEAD(&hdev->whitelist); 3281b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->uuids); 3282b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->link_keys); 3283b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->long_term_keys); 3284970c4e46SJohan Hedberg INIT_LIST_HEAD(&hdev->identity_resolving_keys); 3285b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->remote_oob_data); 3286d2ab0ac1SMarcel Holtmann INIT_LIST_HEAD(&hdev->le_white_list); 328715819a70SAndre Guedes INIT_LIST_HEAD(&hdev->le_conn_params); 328877a77a30SAndre Guedes INIT_LIST_HEAD(&hdev->pend_le_conns); 328966f8455aSJohan Hedberg INIT_LIST_HEAD(&hdev->pend_le_reports); 32906b536b5eSAndrei Emeltchenko INIT_LIST_HEAD(&hdev->conn_hash.list); 3291d2609b34SFlorian Grandel INIT_LIST_HEAD(&hdev->adv_instances); 3292b1b813d4SDavid Herrmann 3293b1b813d4SDavid Herrmann INIT_WORK(&hdev->rx_work, hci_rx_work); 3294b1b813d4SDavid Herrmann INIT_WORK(&hdev->cmd_work, hci_cmd_work); 3295b1b813d4SDavid Herrmann INIT_WORK(&hdev->tx_work, hci_tx_work); 3296b1b813d4SDavid Herrmann INIT_WORK(&hdev->power_on, hci_power_on); 3297c7741d16SMarcel Holtmann INIT_WORK(&hdev->error_reset, hci_error_reset); 3298b1b813d4SDavid Herrmann 3299b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->power_off, hci_power_off); 3300b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off); 3301b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work); 33022d28cfe7SJakub Pawlowski INIT_DELAYED_WORK(&hdev->le_scan_restart, le_scan_restart_work); 33035d900e46SFlorian Grandel INIT_DELAYED_WORK(&hdev->adv_instance_expire, hci_adv_timeout_expire); 3304b1b813d4SDavid Herrmann 3305b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->rx_q); 3306b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->cmd_q); 3307b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->raw_q); 3308b1b813d4SDavid Herrmann 3309b1b813d4SDavid Herrmann init_waitqueue_head(&hdev->req_wait_q); 3310b1b813d4SDavid Herrmann 331165cc2b49SMarcel Holtmann INIT_DELAYED_WORK(&hdev->cmd_timer, hci_cmd_timeout); 3312b1b813d4SDavid Herrmann 3313b1b813d4SDavid Herrmann hci_init_sysfs(hdev); 3314b1b813d4SDavid Herrmann discovery_init(hdev); 33159be0dab7SDavid Herrmann 33169be0dab7SDavid Herrmann return hdev; 33179be0dab7SDavid Herrmann } 33189be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev); 33199be0dab7SDavid Herrmann 33209be0dab7SDavid Herrmann /* Free HCI device */ 33219be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev) 33229be0dab7SDavid Herrmann { 33239be0dab7SDavid Herrmann /* will free via device release */ 33249be0dab7SDavid Herrmann put_device(&hdev->dev); 33259be0dab7SDavid Herrmann } 33269be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev); 33279be0dab7SDavid Herrmann 33281da177e4SLinus Torvalds /* Register HCI device */ 33291da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev) 33301da177e4SLinus Torvalds { 3331b1b813d4SDavid Herrmann int id, error; 33321da177e4SLinus Torvalds 333374292d5aSMarcel Holtmann if (!hdev->open || !hdev->close || !hdev->send) 33341da177e4SLinus Torvalds return -EINVAL; 33351da177e4SLinus Torvalds 333608add513SMat Martineau /* Do not allow HCI_AMP devices to register at index 0, 333708add513SMat Martineau * so the index can be used as the AMP controller ID. 333808add513SMat Martineau */ 33393df92b31SSasha Levin switch (hdev->dev_type) { 33403df92b31SSasha Levin case HCI_BREDR: 33413df92b31SSasha Levin id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL); 33421da177e4SLinus Torvalds break; 33433df92b31SSasha Levin case HCI_AMP: 33443df92b31SSasha Levin id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL); 33453df92b31SSasha Levin break; 33463df92b31SSasha Levin default: 33473df92b31SSasha Levin return -EINVAL; 33481da177e4SLinus Torvalds } 33491da177e4SLinus Torvalds 33503df92b31SSasha Levin if (id < 0) 33513df92b31SSasha Levin return id; 33523df92b31SSasha Levin 33531da177e4SLinus Torvalds sprintf(hdev->name, "hci%d", id); 33541da177e4SLinus Torvalds hdev->id = id; 33552d8b3a11SAndrei Emeltchenko 33562d8b3a11SAndrei Emeltchenko BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); 33572d8b3a11SAndrei Emeltchenko 3358d8537548SKees Cook hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND | 3359d8537548SKees Cook WQ_MEM_RECLAIM, 1, hdev->name); 336033ca954dSDavid Herrmann if (!hdev->workqueue) { 336133ca954dSDavid Herrmann error = -ENOMEM; 336233ca954dSDavid Herrmann goto err; 336333ca954dSDavid Herrmann } 3364f48fd9c8SMarcel Holtmann 3365d8537548SKees Cook hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND | 3366d8537548SKees Cook WQ_MEM_RECLAIM, 1, hdev->name); 33676ead1bbcSJohan Hedberg if (!hdev->req_workqueue) { 33686ead1bbcSJohan Hedberg destroy_workqueue(hdev->workqueue); 33696ead1bbcSJohan Hedberg error = -ENOMEM; 33706ead1bbcSJohan Hedberg goto err; 33716ead1bbcSJohan Hedberg } 33726ead1bbcSJohan Hedberg 33730153e2ecSMarcel Holtmann if (!IS_ERR_OR_NULL(bt_debugfs)) 33740153e2ecSMarcel Holtmann hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs); 33750153e2ecSMarcel Holtmann 3376bdc3e0f1SMarcel Holtmann dev_set_name(&hdev->dev, "%s", hdev->name); 3377bdc3e0f1SMarcel Holtmann 3378bdc3e0f1SMarcel Holtmann error = device_add(&hdev->dev); 337933ca954dSDavid Herrmann if (error < 0) 338054506918SJohan Hedberg goto err_wqueue; 33811da177e4SLinus Torvalds 3382611b30f7SMarcel Holtmann hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev, 3383a8c5fb1aSGustavo Padovan RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops, 3384a8c5fb1aSGustavo Padovan hdev); 3385611b30f7SMarcel Holtmann if (hdev->rfkill) { 3386611b30f7SMarcel Holtmann if (rfkill_register(hdev->rfkill) < 0) { 3387611b30f7SMarcel Holtmann rfkill_destroy(hdev->rfkill); 3388611b30f7SMarcel Holtmann hdev->rfkill = NULL; 3389611b30f7SMarcel Holtmann } 3390611b30f7SMarcel Holtmann } 3391611b30f7SMarcel Holtmann 33925e130367SJohan Hedberg if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) 3393a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RFKILLED); 33945e130367SJohan Hedberg 3395a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_SETUP); 3396a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_AUTO_OFF); 3397ce2be9acSAndrei Emeltchenko 339801cd3404SMarcel Holtmann if (hdev->dev_type == HCI_BREDR) { 339956f87901SJohan Hedberg /* Assume BR/EDR support until proven otherwise (such as 340056f87901SJohan Hedberg * through reading supported features during init. 340156f87901SJohan Hedberg */ 3402a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); 340356f87901SJohan Hedberg } 3404ce2be9acSAndrei Emeltchenko 3405fcee3377SGustavo Padovan write_lock(&hci_dev_list_lock); 3406fcee3377SGustavo Padovan list_add(&hdev->list, &hci_dev_list); 3407fcee3377SGustavo Padovan write_unlock(&hci_dev_list_lock); 3408fcee3377SGustavo Padovan 34094a964404SMarcel Holtmann /* Devices that are marked for raw-only usage are unconfigured 34104a964404SMarcel Holtmann * and should not be included in normal operation. 3411fee746b0SMarcel Holtmann */ 3412fee746b0SMarcel Holtmann if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) 3413a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNCONFIGURED); 3414fee746b0SMarcel Holtmann 34151da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_REG); 3416dc946bd8SDavid Herrmann hci_dev_hold(hdev); 34171da177e4SLinus Torvalds 341819202573SJohan Hedberg queue_work(hdev->req_workqueue, &hdev->power_on); 3419fbe96d6fSMarcel Holtmann 34201da177e4SLinus Torvalds return id; 3421f48fd9c8SMarcel Holtmann 342233ca954dSDavid Herrmann err_wqueue: 342333ca954dSDavid Herrmann destroy_workqueue(hdev->workqueue); 34246ead1bbcSJohan Hedberg destroy_workqueue(hdev->req_workqueue); 342533ca954dSDavid Herrmann err: 34263df92b31SSasha Levin ida_simple_remove(&hci_index_ida, hdev->id); 3427f48fd9c8SMarcel Holtmann 342833ca954dSDavid Herrmann return error; 34291da177e4SLinus Torvalds } 34301da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev); 34311da177e4SLinus Torvalds 34321da177e4SLinus Torvalds /* Unregister HCI device */ 343359735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev) 34341da177e4SLinus Torvalds { 34352d7cc19eSMarcel Holtmann int id; 3436ef222013SMarcel Holtmann 3437c13854ceSMarcel Holtmann BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); 34381da177e4SLinus Torvalds 3439a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNREGISTER); 344094324962SJohan Hovold 34413df92b31SSasha Levin id = hdev->id; 34423df92b31SSasha Levin 3443f20d09d5SGustavo F. Padovan write_lock(&hci_dev_list_lock); 34441da177e4SLinus Torvalds list_del(&hdev->list); 3445f20d09d5SGustavo F. Padovan write_unlock(&hci_dev_list_lock); 34461da177e4SLinus Torvalds 34471da177e4SLinus Torvalds hci_dev_do_close(hdev); 34481da177e4SLinus Torvalds 3449b9b5ef18SGustavo Padovan cancel_work_sync(&hdev->power_on); 3450b9b5ef18SGustavo Padovan 3451ab81cbf9SJohan Hedberg if (!test_bit(HCI_INIT, &hdev->flags) && 3452d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_SETUP) && 3453d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) { 345409fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 3455744cf19eSJohan Hedberg mgmt_index_removed(hdev); 345609fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 345756e5cb86SJohan Hedberg } 3458ab81cbf9SJohan Hedberg 34592e58ef3eSJohan Hedberg /* mgmt_index_removed should take care of emptying the 34602e58ef3eSJohan Hedberg * pending list */ 34612e58ef3eSJohan Hedberg BUG_ON(!list_empty(&hdev->mgmt_pending)); 34622e58ef3eSJohan Hedberg 34631da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_UNREG); 34641da177e4SLinus Torvalds 3465611b30f7SMarcel Holtmann if (hdev->rfkill) { 3466611b30f7SMarcel Holtmann rfkill_unregister(hdev->rfkill); 3467611b30f7SMarcel Holtmann rfkill_destroy(hdev->rfkill); 3468611b30f7SMarcel Holtmann } 3469611b30f7SMarcel Holtmann 3470bdc3e0f1SMarcel Holtmann device_del(&hdev->dev); 3471147e2d59SDave Young 34720153e2ecSMarcel Holtmann debugfs_remove_recursive(hdev->debugfs); 34730153e2ecSMarcel Holtmann 3474f48fd9c8SMarcel Holtmann destroy_workqueue(hdev->workqueue); 34756ead1bbcSJohan Hedberg destroy_workqueue(hdev->req_workqueue); 3476f48fd9c8SMarcel Holtmann 347709fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 3478dcc36c16SJohan Hedberg hci_bdaddr_list_clear(&hdev->blacklist); 34796659358eSJohan Hedberg hci_bdaddr_list_clear(&hdev->whitelist); 34802aeb9a1aSJohan Hedberg hci_uuids_clear(hdev); 348155ed8ca1SJohan Hedberg hci_link_keys_clear(hdev); 3482b899efafSVinicius Costa Gomes hci_smp_ltks_clear(hdev); 3483970c4e46SJohan Hedberg hci_smp_irks_clear(hdev); 34842763eda6SSzymon Janc hci_remote_oob_data_clear(hdev); 3485d2609b34SFlorian Grandel hci_adv_instances_clear(hdev); 3486dcc36c16SJohan Hedberg hci_bdaddr_list_clear(&hdev->le_white_list); 3487373110c5SJohan Hedberg hci_conn_params_clear_all(hdev); 348822078800SMarcel Holtmann hci_discovery_filter_clear(hdev); 348909fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 3490e2e0cacbSJohan Hedberg 3491dc946bd8SDavid Herrmann hci_dev_put(hdev); 34923df92b31SSasha Levin 34933df92b31SSasha Levin ida_simple_remove(&hci_index_ida, id); 34941da177e4SLinus Torvalds } 34951da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev); 34961da177e4SLinus Torvalds 34971da177e4SLinus Torvalds /* Suspend HCI device */ 34981da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev) 34991da177e4SLinus Torvalds { 35001da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_SUSPEND); 35011da177e4SLinus Torvalds return 0; 35021da177e4SLinus Torvalds } 35031da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev); 35041da177e4SLinus Torvalds 35051da177e4SLinus Torvalds /* Resume HCI device */ 35061da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev) 35071da177e4SLinus Torvalds { 35081da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_RESUME); 35091da177e4SLinus Torvalds return 0; 35101da177e4SLinus Torvalds } 35111da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev); 35121da177e4SLinus Torvalds 351375e0569fSMarcel Holtmann /* Reset HCI device */ 351475e0569fSMarcel Holtmann int hci_reset_dev(struct hci_dev *hdev) 351575e0569fSMarcel Holtmann { 351675e0569fSMarcel Holtmann const u8 hw_err[] = { HCI_EV_HARDWARE_ERROR, 0x01, 0x00 }; 351775e0569fSMarcel Holtmann struct sk_buff *skb; 351875e0569fSMarcel Holtmann 351975e0569fSMarcel Holtmann skb = bt_skb_alloc(3, GFP_ATOMIC); 352075e0569fSMarcel Holtmann if (!skb) 352175e0569fSMarcel Holtmann return -ENOMEM; 352275e0569fSMarcel Holtmann 352375e0569fSMarcel Holtmann bt_cb(skb)->pkt_type = HCI_EVENT_PKT; 352475e0569fSMarcel Holtmann memcpy(skb_put(skb, 3), hw_err, 3); 352575e0569fSMarcel Holtmann 352675e0569fSMarcel Holtmann /* Send Hardware Error to upper stack */ 352775e0569fSMarcel Holtmann return hci_recv_frame(hdev, skb); 352875e0569fSMarcel Holtmann } 352975e0569fSMarcel Holtmann EXPORT_SYMBOL(hci_reset_dev); 353075e0569fSMarcel Holtmann 353176bca880SMarcel Holtmann /* Receive frame from HCI drivers */ 3532e1a26170SMarcel Holtmann int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb) 353376bca880SMarcel Holtmann { 353476bca880SMarcel Holtmann if (!hdev || (!test_bit(HCI_UP, &hdev->flags) 353576bca880SMarcel Holtmann && !test_bit(HCI_INIT, &hdev->flags))) { 353676bca880SMarcel Holtmann kfree_skb(skb); 353776bca880SMarcel Holtmann return -ENXIO; 353876bca880SMarcel Holtmann } 353976bca880SMarcel Holtmann 3540d82603c6SJorrit Schippers /* Incoming skb */ 354176bca880SMarcel Holtmann bt_cb(skb)->incoming = 1; 354276bca880SMarcel Holtmann 354376bca880SMarcel Holtmann /* Time stamp */ 354476bca880SMarcel Holtmann __net_timestamp(skb); 354576bca880SMarcel Holtmann 354676bca880SMarcel Holtmann skb_queue_tail(&hdev->rx_q, skb); 3547b78752ccSMarcel Holtmann queue_work(hdev->workqueue, &hdev->rx_work); 3548c78ae283SMarcel Holtmann 354976bca880SMarcel Holtmann return 0; 355076bca880SMarcel Holtmann } 355176bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame); 355276bca880SMarcel Holtmann 3553e875ff84SMarcel Holtmann /* Receive diagnostic message from HCI drivers */ 3554e875ff84SMarcel Holtmann int hci_recv_diag(struct hci_dev *hdev, struct sk_buff *skb) 3555e875ff84SMarcel Holtmann { 3556e875ff84SMarcel Holtmann /* Time stamp */ 3557e875ff84SMarcel Holtmann __net_timestamp(skb); 3558e875ff84SMarcel Holtmann 3559e875ff84SMarcel Holtmann /* Mark as diagnostic packet and send to monitor */ 3560e875ff84SMarcel Holtmann bt_cb(skb)->pkt_type = HCI_DIAG_PKT; 3561e875ff84SMarcel Holtmann hci_send_to_monitor(hdev, skb); 3562e875ff84SMarcel Holtmann 3563e875ff84SMarcel Holtmann kfree_skb(skb); 3564e875ff84SMarcel Holtmann return 0; 3565e875ff84SMarcel Holtmann } 3566e875ff84SMarcel Holtmann EXPORT_SYMBOL(hci_recv_diag); 3567e875ff84SMarcel Holtmann 35681da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */ 35691da177e4SLinus Torvalds 35701da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb) 35711da177e4SLinus Torvalds { 35721da177e4SLinus Torvalds BT_DBG("%p name %s", cb, cb->name); 35731da177e4SLinus Torvalds 3574fba7ecf0SJohan Hedberg mutex_lock(&hci_cb_list_lock); 357500629e0fSJohan Hedberg list_add_tail(&cb->list, &hci_cb_list); 3576fba7ecf0SJohan Hedberg mutex_unlock(&hci_cb_list_lock); 35771da177e4SLinus Torvalds 35781da177e4SLinus Torvalds return 0; 35791da177e4SLinus Torvalds } 35801da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb); 35811da177e4SLinus Torvalds 35821da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb) 35831da177e4SLinus Torvalds { 35841da177e4SLinus Torvalds BT_DBG("%p name %s", cb, cb->name); 35851da177e4SLinus Torvalds 3586fba7ecf0SJohan Hedberg mutex_lock(&hci_cb_list_lock); 35871da177e4SLinus Torvalds list_del(&cb->list); 3588fba7ecf0SJohan Hedberg mutex_unlock(&hci_cb_list_lock); 35891da177e4SLinus Torvalds 35901da177e4SLinus Torvalds return 0; 35911da177e4SLinus Torvalds } 35921da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb); 35931da177e4SLinus Torvalds 359451086991SMarcel Holtmann static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) 35951da177e4SLinus Torvalds { 3596cdc52faaSMarcel Holtmann int err; 3597cdc52faaSMarcel Holtmann 35980d48d939SMarcel Holtmann BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len); 35991da177e4SLinus Torvalds 36001da177e4SLinus Torvalds /* Time stamp */ 3601a61bbcf2SPatrick McHardy __net_timestamp(skb); 36021da177e4SLinus Torvalds 3603cd82e61cSMarcel Holtmann /* Send copy to monitor */ 3604cd82e61cSMarcel Holtmann hci_send_to_monitor(hdev, skb); 3605cd82e61cSMarcel Holtmann 3606cd82e61cSMarcel Holtmann if (atomic_read(&hdev->promisc)) { 3607cd82e61cSMarcel Holtmann /* Send copy to the sockets */ 3608470fe1b5SMarcel Holtmann hci_send_to_sock(hdev, skb); 36091da177e4SLinus Torvalds } 36101da177e4SLinus Torvalds 36111da177e4SLinus Torvalds /* Get rid of skb owner, prior to sending to the driver. */ 36121da177e4SLinus Torvalds skb_orphan(skb); 36131da177e4SLinus Torvalds 361473d0d3c8SMarcel Holtmann if (!test_bit(HCI_RUNNING, &hdev->flags)) { 361573d0d3c8SMarcel Holtmann kfree_skb(skb); 361673d0d3c8SMarcel Holtmann return; 361773d0d3c8SMarcel Holtmann } 361873d0d3c8SMarcel Holtmann 3619cdc52faaSMarcel Holtmann err = hdev->send(hdev, skb); 3620cdc52faaSMarcel Holtmann if (err < 0) { 3621cdc52faaSMarcel Holtmann BT_ERR("%s sending frame failed (%d)", hdev->name, err); 3622cdc52faaSMarcel Holtmann kfree_skb(skb); 3623cdc52faaSMarcel Holtmann } 36241da177e4SLinus Torvalds } 36251da177e4SLinus Torvalds 36261ca3a9d0SJohan Hedberg /* Send HCI command */ 362707dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, 362807dc93ddSJohan Hedberg const void *param) 36291ca3a9d0SJohan Hedberg { 36301ca3a9d0SJohan Hedberg struct sk_buff *skb; 36311ca3a9d0SJohan Hedberg 36321ca3a9d0SJohan Hedberg BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen); 36331ca3a9d0SJohan Hedberg 36341ca3a9d0SJohan Hedberg skb = hci_prepare_cmd(hdev, opcode, plen, param); 36351ca3a9d0SJohan Hedberg if (!skb) { 36361ca3a9d0SJohan Hedberg BT_ERR("%s no memory for command", hdev->name); 36371ca3a9d0SJohan Hedberg return -ENOMEM; 36381ca3a9d0SJohan Hedberg } 36391ca3a9d0SJohan Hedberg 364049c922bbSStephen Hemminger /* Stand-alone HCI commands must be flagged as 364111714b3dSJohan Hedberg * single-command requests. 364211714b3dSJohan Hedberg */ 3643db6e3e8dSJohan Hedberg bt_cb(skb)->req.start = true; 364411714b3dSJohan Hedberg 36451da177e4SLinus Torvalds skb_queue_tail(&hdev->cmd_q, skb); 3646c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 36471da177e4SLinus Torvalds 36481da177e4SLinus Torvalds return 0; 36491da177e4SLinus Torvalds } 36501da177e4SLinus Torvalds 36511da177e4SLinus Torvalds /* Get data from the previously sent command */ 3652a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode) 36531da177e4SLinus Torvalds { 36541da177e4SLinus Torvalds struct hci_command_hdr *hdr; 36551da177e4SLinus Torvalds 36561da177e4SLinus Torvalds if (!hdev->sent_cmd) 36571da177e4SLinus Torvalds return NULL; 36581da177e4SLinus Torvalds 36591da177e4SLinus Torvalds hdr = (void *) hdev->sent_cmd->data; 36601da177e4SLinus Torvalds 3661a9de9248SMarcel Holtmann if (hdr->opcode != cpu_to_le16(opcode)) 36621da177e4SLinus Torvalds return NULL; 36631da177e4SLinus Torvalds 3664f0e09510SAndrei Emeltchenko BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode); 36651da177e4SLinus Torvalds 36661da177e4SLinus Torvalds return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE; 36671da177e4SLinus Torvalds } 36681da177e4SLinus Torvalds 3669fbef168fSLoic Poulain /* Send HCI command and wait for command commplete event */ 3670fbef168fSLoic Poulain struct sk_buff *hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, 3671fbef168fSLoic Poulain const void *param, u32 timeout) 3672fbef168fSLoic Poulain { 3673fbef168fSLoic Poulain struct sk_buff *skb; 3674fbef168fSLoic Poulain 3675fbef168fSLoic Poulain if (!test_bit(HCI_UP, &hdev->flags)) 3676fbef168fSLoic Poulain return ERR_PTR(-ENETDOWN); 3677fbef168fSLoic Poulain 3678fbef168fSLoic Poulain bt_dev_dbg(hdev, "opcode 0x%4.4x plen %d", opcode, plen); 3679fbef168fSLoic Poulain 3680fbef168fSLoic Poulain hci_req_lock(hdev); 3681fbef168fSLoic Poulain skb = __hci_cmd_sync(hdev, opcode, plen, param, timeout); 3682fbef168fSLoic Poulain hci_req_unlock(hdev); 3683fbef168fSLoic Poulain 3684fbef168fSLoic Poulain return skb; 3685fbef168fSLoic Poulain } 3686fbef168fSLoic Poulain EXPORT_SYMBOL(hci_cmd_sync); 3687fbef168fSLoic Poulain 36881da177e4SLinus Torvalds /* Send ACL data */ 36891da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags) 36901da177e4SLinus Torvalds { 36911da177e4SLinus Torvalds struct hci_acl_hdr *hdr; 36921da177e4SLinus Torvalds int len = skb->len; 36931da177e4SLinus Torvalds 3694badff6d0SArnaldo Carvalho de Melo skb_push(skb, HCI_ACL_HDR_SIZE); 3695badff6d0SArnaldo Carvalho de Melo skb_reset_transport_header(skb); 36969c70220bSArnaldo Carvalho de Melo hdr = (struct hci_acl_hdr *)skb_transport_header(skb); 3697aca3192cSYOSHIFUJI Hideaki hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags)); 3698aca3192cSYOSHIFUJI Hideaki hdr->dlen = cpu_to_le16(len); 36991da177e4SLinus Torvalds } 37001da177e4SLinus Torvalds 3701ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue, 370273d80debSLuiz Augusto von Dentz struct sk_buff *skb, __u16 flags) 37031da177e4SLinus Torvalds { 3704ee22be7eSAndrei Emeltchenko struct hci_conn *conn = chan->conn; 37051da177e4SLinus Torvalds struct hci_dev *hdev = conn->hdev; 37061da177e4SLinus Torvalds struct sk_buff *list; 37071da177e4SLinus Torvalds 3708087bfd99SGustavo Padovan skb->len = skb_headlen(skb); 3709087bfd99SGustavo Padovan skb->data_len = 0; 3710087bfd99SGustavo Padovan 3711087bfd99SGustavo Padovan bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; 3712204a6e54SAndrei Emeltchenko 3713204a6e54SAndrei Emeltchenko switch (hdev->dev_type) { 3714204a6e54SAndrei Emeltchenko case HCI_BREDR: 3715087bfd99SGustavo Padovan hci_add_acl_hdr(skb, conn->handle, flags); 3716204a6e54SAndrei Emeltchenko break; 3717204a6e54SAndrei Emeltchenko case HCI_AMP: 3718204a6e54SAndrei Emeltchenko hci_add_acl_hdr(skb, chan->handle, flags); 3719204a6e54SAndrei Emeltchenko break; 3720204a6e54SAndrei Emeltchenko default: 3721204a6e54SAndrei Emeltchenko BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type); 3722204a6e54SAndrei Emeltchenko return; 3723204a6e54SAndrei Emeltchenko } 3724087bfd99SGustavo Padovan 372570f23020SAndrei Emeltchenko list = skb_shinfo(skb)->frag_list; 372670f23020SAndrei Emeltchenko if (!list) { 37271da177e4SLinus Torvalds /* Non fragmented */ 37281da177e4SLinus Torvalds BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len); 37291da177e4SLinus Torvalds 373073d80debSLuiz Augusto von Dentz skb_queue_tail(queue, skb); 37311da177e4SLinus Torvalds } else { 37321da177e4SLinus Torvalds /* Fragmented */ 37331da177e4SLinus Torvalds BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len); 37341da177e4SLinus Torvalds 37351da177e4SLinus Torvalds skb_shinfo(skb)->frag_list = NULL; 37361da177e4SLinus Torvalds 37379cfd5a23SJukka Rissanen /* Queue all fragments atomically. We need to use spin_lock_bh 37389cfd5a23SJukka Rissanen * here because of 6LoWPAN links, as there this function is 37399cfd5a23SJukka Rissanen * called from softirq and using normal spin lock could cause 37409cfd5a23SJukka Rissanen * deadlocks. 37419cfd5a23SJukka Rissanen */ 37429cfd5a23SJukka Rissanen spin_lock_bh(&queue->lock); 37431da177e4SLinus Torvalds 374473d80debSLuiz Augusto von Dentz __skb_queue_tail(queue, skb); 3745e702112fSAndrei Emeltchenko 3746e702112fSAndrei Emeltchenko flags &= ~ACL_START; 3747e702112fSAndrei Emeltchenko flags |= ACL_CONT; 37481da177e4SLinus Torvalds do { 37491da177e4SLinus Torvalds skb = list; list = list->next; 37501da177e4SLinus Torvalds 37510d48d939SMarcel Holtmann bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; 3752e702112fSAndrei Emeltchenko hci_add_acl_hdr(skb, conn->handle, flags); 37531da177e4SLinus Torvalds 37541da177e4SLinus Torvalds BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len); 37551da177e4SLinus Torvalds 375673d80debSLuiz Augusto von Dentz __skb_queue_tail(queue, skb); 37571da177e4SLinus Torvalds } while (list); 37581da177e4SLinus Torvalds 37599cfd5a23SJukka Rissanen spin_unlock_bh(&queue->lock); 37601da177e4SLinus Torvalds } 376173d80debSLuiz Augusto von Dentz } 376273d80debSLuiz Augusto von Dentz 376373d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags) 376473d80debSLuiz Augusto von Dentz { 3765ee22be7eSAndrei Emeltchenko struct hci_dev *hdev = chan->conn->hdev; 376673d80debSLuiz Augusto von Dentz 3767f0e09510SAndrei Emeltchenko BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags); 376873d80debSLuiz Augusto von Dentz 3769ee22be7eSAndrei Emeltchenko hci_queue_acl(chan, &chan->data_q, skb, flags); 37701da177e4SLinus Torvalds 37713eff45eaSGustavo F. Padovan queue_work(hdev->workqueue, &hdev->tx_work); 37721da177e4SLinus Torvalds } 37731da177e4SLinus Torvalds 37741da177e4SLinus Torvalds /* Send SCO data */ 37750d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb) 37761da177e4SLinus Torvalds { 37771da177e4SLinus Torvalds struct hci_dev *hdev = conn->hdev; 37781da177e4SLinus Torvalds struct hci_sco_hdr hdr; 37791da177e4SLinus Torvalds 37801da177e4SLinus Torvalds BT_DBG("%s len %d", hdev->name, skb->len); 37811da177e4SLinus Torvalds 3782aca3192cSYOSHIFUJI Hideaki hdr.handle = cpu_to_le16(conn->handle); 37831da177e4SLinus Torvalds hdr.dlen = skb->len; 37841da177e4SLinus Torvalds 3785badff6d0SArnaldo Carvalho de Melo skb_push(skb, HCI_SCO_HDR_SIZE); 3786badff6d0SArnaldo Carvalho de Melo skb_reset_transport_header(skb); 37879c70220bSArnaldo Carvalho de Melo memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE); 37881da177e4SLinus Torvalds 37890d48d939SMarcel Holtmann bt_cb(skb)->pkt_type = HCI_SCODATA_PKT; 3790c78ae283SMarcel Holtmann 37911da177e4SLinus Torvalds skb_queue_tail(&conn->data_q, skb); 37923eff45eaSGustavo F. Padovan queue_work(hdev->workqueue, &hdev->tx_work); 37931da177e4SLinus Torvalds } 37941da177e4SLinus Torvalds 37951da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */ 37961da177e4SLinus Torvalds 37971da177e4SLinus Torvalds /* HCI Connection scheduler */ 37986039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type, 3799a8c5fb1aSGustavo Padovan int *quote) 38001da177e4SLinus Torvalds { 38011da177e4SLinus Torvalds struct hci_conn_hash *h = &hdev->conn_hash; 38028035ded4SLuiz Augusto von Dentz struct hci_conn *conn = NULL, *c; 3803abc5de8fSMikel Astiz unsigned int num = 0, min = ~0; 38041da177e4SLinus Torvalds 38051da177e4SLinus Torvalds /* We don't have to lock device here. Connections are always 38061da177e4SLinus Torvalds * added and removed with TX task disabled. */ 3807bf4c6325SGustavo F. Padovan 3808bf4c6325SGustavo F. Padovan rcu_read_lock(); 3809bf4c6325SGustavo F. Padovan 3810bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(c, &h->list, list) { 3811769be974SMarcel Holtmann if (c->type != type || skb_queue_empty(&c->data_q)) 38121da177e4SLinus Torvalds continue; 3813769be974SMarcel Holtmann 3814769be974SMarcel Holtmann if (c->state != BT_CONNECTED && c->state != BT_CONFIG) 3815769be974SMarcel Holtmann continue; 3816769be974SMarcel Holtmann 38171da177e4SLinus Torvalds num++; 38181da177e4SLinus Torvalds 38191da177e4SLinus Torvalds if (c->sent < min) { 38201da177e4SLinus Torvalds min = c->sent; 38211da177e4SLinus Torvalds conn = c; 38221da177e4SLinus Torvalds } 382352087a79SLuiz Augusto von Dentz 382452087a79SLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == num) 382552087a79SLuiz Augusto von Dentz break; 38261da177e4SLinus Torvalds } 38271da177e4SLinus Torvalds 3828bf4c6325SGustavo F. Padovan rcu_read_unlock(); 3829bf4c6325SGustavo F. Padovan 38301da177e4SLinus Torvalds if (conn) { 38316ed58ec5SVille Tervo int cnt, q; 38326ed58ec5SVille Tervo 38336ed58ec5SVille Tervo switch (conn->type) { 38346ed58ec5SVille Tervo case ACL_LINK: 38356ed58ec5SVille Tervo cnt = hdev->acl_cnt; 38366ed58ec5SVille Tervo break; 38376ed58ec5SVille Tervo case SCO_LINK: 38386ed58ec5SVille Tervo case ESCO_LINK: 38396ed58ec5SVille Tervo cnt = hdev->sco_cnt; 38406ed58ec5SVille Tervo break; 38416ed58ec5SVille Tervo case LE_LINK: 38426ed58ec5SVille Tervo cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt; 38436ed58ec5SVille Tervo break; 38446ed58ec5SVille Tervo default: 38456ed58ec5SVille Tervo cnt = 0; 38466ed58ec5SVille Tervo BT_ERR("Unknown link type"); 38476ed58ec5SVille Tervo } 38486ed58ec5SVille Tervo 38496ed58ec5SVille Tervo q = cnt / num; 38501da177e4SLinus Torvalds *quote = q ? q : 1; 38511da177e4SLinus Torvalds } else 38521da177e4SLinus Torvalds *quote = 0; 38531da177e4SLinus Torvalds 38541da177e4SLinus Torvalds BT_DBG("conn %p quote %d", conn, *quote); 38551da177e4SLinus Torvalds return conn; 38561da177e4SLinus Torvalds } 38571da177e4SLinus Torvalds 38586039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type) 38591da177e4SLinus Torvalds { 38601da177e4SLinus Torvalds struct hci_conn_hash *h = &hdev->conn_hash; 38611da177e4SLinus Torvalds struct hci_conn *c; 38621da177e4SLinus Torvalds 3863bae1f5d9SVille Tervo BT_ERR("%s link tx timeout", hdev->name); 38641da177e4SLinus Torvalds 3865bf4c6325SGustavo F. Padovan rcu_read_lock(); 3866bf4c6325SGustavo F. Padovan 38671da177e4SLinus Torvalds /* Kill stalled connections */ 3868bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(c, &h->list, list) { 3869bae1f5d9SVille Tervo if (c->type == type && c->sent) { 38706ed93dc6SAndrei Emeltchenko BT_ERR("%s killing stalled connection %pMR", 38716ed93dc6SAndrei Emeltchenko hdev->name, &c->dst); 3872bed71748SAndre Guedes hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM); 38731da177e4SLinus Torvalds } 38741da177e4SLinus Torvalds } 3875bf4c6325SGustavo F. Padovan 3876bf4c6325SGustavo F. Padovan rcu_read_unlock(); 38771da177e4SLinus Torvalds } 38781da177e4SLinus Torvalds 38796039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type, 388073d80debSLuiz Augusto von Dentz int *quote) 388173d80debSLuiz Augusto von Dentz { 388273d80debSLuiz Augusto von Dentz struct hci_conn_hash *h = &hdev->conn_hash; 388373d80debSLuiz Augusto von Dentz struct hci_chan *chan = NULL; 3884abc5de8fSMikel Astiz unsigned int num = 0, min = ~0, cur_prio = 0; 388573d80debSLuiz Augusto von Dentz struct hci_conn *conn; 388673d80debSLuiz Augusto von Dentz int cnt, q, conn_num = 0; 388773d80debSLuiz Augusto von Dentz 388873d80debSLuiz Augusto von Dentz BT_DBG("%s", hdev->name); 388973d80debSLuiz Augusto von Dentz 3890bf4c6325SGustavo F. Padovan rcu_read_lock(); 3891bf4c6325SGustavo F. Padovan 3892bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(conn, &h->list, list) { 389373d80debSLuiz Augusto von Dentz struct hci_chan *tmp; 389473d80debSLuiz Augusto von Dentz 389573d80debSLuiz Augusto von Dentz if (conn->type != type) 389673d80debSLuiz Augusto von Dentz continue; 389773d80debSLuiz Augusto von Dentz 389873d80debSLuiz Augusto von Dentz if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG) 389973d80debSLuiz Augusto von Dentz continue; 390073d80debSLuiz Augusto von Dentz 390173d80debSLuiz Augusto von Dentz conn_num++; 390273d80debSLuiz Augusto von Dentz 39038192edefSGustavo F. Padovan list_for_each_entry_rcu(tmp, &conn->chan_list, list) { 390473d80debSLuiz Augusto von Dentz struct sk_buff *skb; 390573d80debSLuiz Augusto von Dentz 390673d80debSLuiz Augusto von Dentz if (skb_queue_empty(&tmp->data_q)) 390773d80debSLuiz Augusto von Dentz continue; 390873d80debSLuiz Augusto von Dentz 390973d80debSLuiz Augusto von Dentz skb = skb_peek(&tmp->data_q); 391073d80debSLuiz Augusto von Dentz if (skb->priority < cur_prio) 391173d80debSLuiz Augusto von Dentz continue; 391273d80debSLuiz Augusto von Dentz 391373d80debSLuiz Augusto von Dentz if (skb->priority > cur_prio) { 391473d80debSLuiz Augusto von Dentz num = 0; 391573d80debSLuiz Augusto von Dentz min = ~0; 391673d80debSLuiz Augusto von Dentz cur_prio = skb->priority; 391773d80debSLuiz Augusto von Dentz } 391873d80debSLuiz Augusto von Dentz 391973d80debSLuiz Augusto von Dentz num++; 392073d80debSLuiz Augusto von Dentz 392173d80debSLuiz Augusto von Dentz if (conn->sent < min) { 392273d80debSLuiz Augusto von Dentz min = conn->sent; 392373d80debSLuiz Augusto von Dentz chan = tmp; 392473d80debSLuiz Augusto von Dentz } 392573d80debSLuiz Augusto von Dentz } 392673d80debSLuiz Augusto von Dentz 392773d80debSLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == conn_num) 392873d80debSLuiz Augusto von Dentz break; 392973d80debSLuiz Augusto von Dentz } 393073d80debSLuiz Augusto von Dentz 3931bf4c6325SGustavo F. Padovan rcu_read_unlock(); 3932bf4c6325SGustavo F. Padovan 393373d80debSLuiz Augusto von Dentz if (!chan) 393473d80debSLuiz Augusto von Dentz return NULL; 393573d80debSLuiz Augusto von Dentz 393673d80debSLuiz Augusto von Dentz switch (chan->conn->type) { 393773d80debSLuiz Augusto von Dentz case ACL_LINK: 393873d80debSLuiz Augusto von Dentz cnt = hdev->acl_cnt; 393973d80debSLuiz Augusto von Dentz break; 3940bd1eb66bSAndrei Emeltchenko case AMP_LINK: 3941bd1eb66bSAndrei Emeltchenko cnt = hdev->block_cnt; 3942bd1eb66bSAndrei Emeltchenko break; 394373d80debSLuiz Augusto von Dentz case SCO_LINK: 394473d80debSLuiz Augusto von Dentz case ESCO_LINK: 394573d80debSLuiz Augusto von Dentz cnt = hdev->sco_cnt; 394673d80debSLuiz Augusto von Dentz break; 394773d80debSLuiz Augusto von Dentz case LE_LINK: 394873d80debSLuiz Augusto von Dentz cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt; 394973d80debSLuiz Augusto von Dentz break; 395073d80debSLuiz Augusto von Dentz default: 395173d80debSLuiz Augusto von Dentz cnt = 0; 395273d80debSLuiz Augusto von Dentz BT_ERR("Unknown link type"); 395373d80debSLuiz Augusto von Dentz } 395473d80debSLuiz Augusto von Dentz 395573d80debSLuiz Augusto von Dentz q = cnt / num; 395673d80debSLuiz Augusto von Dentz *quote = q ? q : 1; 395773d80debSLuiz Augusto von Dentz BT_DBG("chan %p quote %d", chan, *quote); 395873d80debSLuiz Augusto von Dentz return chan; 395973d80debSLuiz Augusto von Dentz } 396073d80debSLuiz Augusto von Dentz 396102b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type) 396202b20f0bSLuiz Augusto von Dentz { 396302b20f0bSLuiz Augusto von Dentz struct hci_conn_hash *h = &hdev->conn_hash; 396402b20f0bSLuiz Augusto von Dentz struct hci_conn *conn; 396502b20f0bSLuiz Augusto von Dentz int num = 0; 396602b20f0bSLuiz Augusto von Dentz 396702b20f0bSLuiz Augusto von Dentz BT_DBG("%s", hdev->name); 396802b20f0bSLuiz Augusto von Dentz 3969bf4c6325SGustavo F. Padovan rcu_read_lock(); 3970bf4c6325SGustavo F. Padovan 3971bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(conn, &h->list, list) { 397202b20f0bSLuiz Augusto von Dentz struct hci_chan *chan; 397302b20f0bSLuiz Augusto von Dentz 397402b20f0bSLuiz Augusto von Dentz if (conn->type != type) 397502b20f0bSLuiz Augusto von Dentz continue; 397602b20f0bSLuiz Augusto von Dentz 397702b20f0bSLuiz Augusto von Dentz if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG) 397802b20f0bSLuiz Augusto von Dentz continue; 397902b20f0bSLuiz Augusto von Dentz 398002b20f0bSLuiz Augusto von Dentz num++; 398102b20f0bSLuiz Augusto von Dentz 39828192edefSGustavo F. Padovan list_for_each_entry_rcu(chan, &conn->chan_list, list) { 398302b20f0bSLuiz Augusto von Dentz struct sk_buff *skb; 398402b20f0bSLuiz Augusto von Dentz 398502b20f0bSLuiz Augusto von Dentz if (chan->sent) { 398602b20f0bSLuiz Augusto von Dentz chan->sent = 0; 398702b20f0bSLuiz Augusto von Dentz continue; 398802b20f0bSLuiz Augusto von Dentz } 398902b20f0bSLuiz Augusto von Dentz 399002b20f0bSLuiz Augusto von Dentz if (skb_queue_empty(&chan->data_q)) 399102b20f0bSLuiz Augusto von Dentz continue; 399202b20f0bSLuiz Augusto von Dentz 399302b20f0bSLuiz Augusto von Dentz skb = skb_peek(&chan->data_q); 399402b20f0bSLuiz Augusto von Dentz if (skb->priority >= HCI_PRIO_MAX - 1) 399502b20f0bSLuiz Augusto von Dentz continue; 399602b20f0bSLuiz Augusto von Dentz 399702b20f0bSLuiz Augusto von Dentz skb->priority = HCI_PRIO_MAX - 1; 399802b20f0bSLuiz Augusto von Dentz 399902b20f0bSLuiz Augusto von Dentz BT_DBG("chan %p skb %p promoted to %d", chan, skb, 400002b20f0bSLuiz Augusto von Dentz skb->priority); 400102b20f0bSLuiz Augusto von Dentz } 400202b20f0bSLuiz Augusto von Dentz 400302b20f0bSLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == num) 400402b20f0bSLuiz Augusto von Dentz break; 400502b20f0bSLuiz Augusto von Dentz } 4006bf4c6325SGustavo F. Padovan 4007bf4c6325SGustavo F. Padovan rcu_read_unlock(); 4008bf4c6325SGustavo F. Padovan 400902b20f0bSLuiz Augusto von Dentz } 401002b20f0bSLuiz Augusto von Dentz 4011b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb) 4012b71d385aSAndrei Emeltchenko { 4013b71d385aSAndrei Emeltchenko /* Calculate count of blocks used by this packet */ 4014b71d385aSAndrei Emeltchenko return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len); 4015b71d385aSAndrei Emeltchenko } 4016b71d385aSAndrei Emeltchenko 40176039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt) 40181da177e4SLinus Torvalds { 4019d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 40201da177e4SLinus Torvalds /* ACL tx timeout must be longer than maximum 40211da177e4SLinus Torvalds * link supervision timeout (40.9 seconds) */ 402263d2bc1bSAndrei Emeltchenko if (!cnt && time_after(jiffies, hdev->acl_last_tx + 40235f246e89SAndrei Emeltchenko HCI_ACL_TX_TIMEOUT)) 4024bae1f5d9SVille Tervo hci_link_tx_to(hdev, ACL_LINK); 40251da177e4SLinus Torvalds } 402663d2bc1bSAndrei Emeltchenko } 40271da177e4SLinus Torvalds 40286039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev) 402963d2bc1bSAndrei Emeltchenko { 403063d2bc1bSAndrei Emeltchenko unsigned int cnt = hdev->acl_cnt; 403163d2bc1bSAndrei Emeltchenko struct hci_chan *chan; 403263d2bc1bSAndrei Emeltchenko struct sk_buff *skb; 403363d2bc1bSAndrei Emeltchenko int quote; 403463d2bc1bSAndrei Emeltchenko 403563d2bc1bSAndrei Emeltchenko __check_timeout(hdev, cnt); 403604837f64SMarcel Holtmann 403773d80debSLuiz Augusto von Dentz while (hdev->acl_cnt && 403873d80debSLuiz Augusto von Dentz (chan = hci_chan_sent(hdev, ACL_LINK, "e))) { 4039ec1cce24SLuiz Augusto von Dentz u32 priority = (skb_peek(&chan->data_q))->priority; 4040ec1cce24SLuiz Augusto von Dentz while (quote-- && (skb = skb_peek(&chan->data_q))) { 404173d80debSLuiz Augusto von Dentz BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 404273d80debSLuiz Augusto von Dentz skb->len, skb->priority); 404373d80debSLuiz Augusto von Dentz 4044ec1cce24SLuiz Augusto von Dentz /* Stop if priority has changed */ 4045ec1cce24SLuiz Augusto von Dentz if (skb->priority < priority) 4046ec1cce24SLuiz Augusto von Dentz break; 4047ec1cce24SLuiz Augusto von Dentz 4048ec1cce24SLuiz Augusto von Dentz skb = skb_dequeue(&chan->data_q); 4049ec1cce24SLuiz Augusto von Dentz 405073d80debSLuiz Augusto von Dentz hci_conn_enter_active_mode(chan->conn, 405173d80debSLuiz Augusto von Dentz bt_cb(skb)->force_active); 405204837f64SMarcel Holtmann 405357d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 40541da177e4SLinus Torvalds hdev->acl_last_tx = jiffies; 40551da177e4SLinus Torvalds 40561da177e4SLinus Torvalds hdev->acl_cnt--; 405773d80debSLuiz Augusto von Dentz chan->sent++; 405873d80debSLuiz Augusto von Dentz chan->conn->sent++; 40591da177e4SLinus Torvalds } 40601da177e4SLinus Torvalds } 406102b20f0bSLuiz Augusto von Dentz 406202b20f0bSLuiz Augusto von Dentz if (cnt != hdev->acl_cnt) 406302b20f0bSLuiz Augusto von Dentz hci_prio_recalculate(hdev, ACL_LINK); 40641da177e4SLinus Torvalds } 40651da177e4SLinus Torvalds 40666039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev) 4067b71d385aSAndrei Emeltchenko { 406863d2bc1bSAndrei Emeltchenko unsigned int cnt = hdev->block_cnt; 4069b71d385aSAndrei Emeltchenko struct hci_chan *chan; 4070b71d385aSAndrei Emeltchenko struct sk_buff *skb; 4071b71d385aSAndrei Emeltchenko int quote; 4072bd1eb66bSAndrei Emeltchenko u8 type; 4073b71d385aSAndrei Emeltchenko 407463d2bc1bSAndrei Emeltchenko __check_timeout(hdev, cnt); 4075b71d385aSAndrei Emeltchenko 4076bd1eb66bSAndrei Emeltchenko BT_DBG("%s", hdev->name); 4077bd1eb66bSAndrei Emeltchenko 4078bd1eb66bSAndrei Emeltchenko if (hdev->dev_type == HCI_AMP) 4079bd1eb66bSAndrei Emeltchenko type = AMP_LINK; 4080bd1eb66bSAndrei Emeltchenko else 4081bd1eb66bSAndrei Emeltchenko type = ACL_LINK; 4082bd1eb66bSAndrei Emeltchenko 4083b71d385aSAndrei Emeltchenko while (hdev->block_cnt > 0 && 4084bd1eb66bSAndrei Emeltchenko (chan = hci_chan_sent(hdev, type, "e))) { 4085b71d385aSAndrei Emeltchenko u32 priority = (skb_peek(&chan->data_q))->priority; 4086b71d385aSAndrei Emeltchenko while (quote > 0 && (skb = skb_peek(&chan->data_q))) { 4087b71d385aSAndrei Emeltchenko int blocks; 4088b71d385aSAndrei Emeltchenko 4089b71d385aSAndrei Emeltchenko BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 4090b71d385aSAndrei Emeltchenko skb->len, skb->priority); 4091b71d385aSAndrei Emeltchenko 4092b71d385aSAndrei Emeltchenko /* Stop if priority has changed */ 4093b71d385aSAndrei Emeltchenko if (skb->priority < priority) 4094b71d385aSAndrei Emeltchenko break; 4095b71d385aSAndrei Emeltchenko 4096b71d385aSAndrei Emeltchenko skb = skb_dequeue(&chan->data_q); 4097b71d385aSAndrei Emeltchenko 4098b71d385aSAndrei Emeltchenko blocks = __get_blocks(hdev, skb); 4099b71d385aSAndrei Emeltchenko if (blocks > hdev->block_cnt) 4100b71d385aSAndrei Emeltchenko return; 4101b71d385aSAndrei Emeltchenko 4102b71d385aSAndrei Emeltchenko hci_conn_enter_active_mode(chan->conn, 4103b71d385aSAndrei Emeltchenko bt_cb(skb)->force_active); 4104b71d385aSAndrei Emeltchenko 410557d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 4106b71d385aSAndrei Emeltchenko hdev->acl_last_tx = jiffies; 4107b71d385aSAndrei Emeltchenko 4108b71d385aSAndrei Emeltchenko hdev->block_cnt -= blocks; 4109b71d385aSAndrei Emeltchenko quote -= blocks; 4110b71d385aSAndrei Emeltchenko 4111b71d385aSAndrei Emeltchenko chan->sent += blocks; 4112b71d385aSAndrei Emeltchenko chan->conn->sent += blocks; 4113b71d385aSAndrei Emeltchenko } 4114b71d385aSAndrei Emeltchenko } 4115b71d385aSAndrei Emeltchenko 4116b71d385aSAndrei Emeltchenko if (cnt != hdev->block_cnt) 4117bd1eb66bSAndrei Emeltchenko hci_prio_recalculate(hdev, type); 4118b71d385aSAndrei Emeltchenko } 4119b71d385aSAndrei Emeltchenko 41206039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev) 4121b71d385aSAndrei Emeltchenko { 4122b71d385aSAndrei Emeltchenko BT_DBG("%s", hdev->name); 4123b71d385aSAndrei Emeltchenko 4124bd1eb66bSAndrei Emeltchenko /* No ACL link over BR/EDR controller */ 4125bd1eb66bSAndrei Emeltchenko if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR) 4126bd1eb66bSAndrei Emeltchenko return; 4127bd1eb66bSAndrei Emeltchenko 4128bd1eb66bSAndrei Emeltchenko /* No AMP link over AMP controller */ 4129bd1eb66bSAndrei Emeltchenko if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP) 4130b71d385aSAndrei Emeltchenko return; 4131b71d385aSAndrei Emeltchenko 4132b71d385aSAndrei Emeltchenko switch (hdev->flow_ctl_mode) { 4133b71d385aSAndrei Emeltchenko case HCI_FLOW_CTL_MODE_PACKET_BASED: 4134b71d385aSAndrei Emeltchenko hci_sched_acl_pkt(hdev); 4135b71d385aSAndrei Emeltchenko break; 4136b71d385aSAndrei Emeltchenko 4137b71d385aSAndrei Emeltchenko case HCI_FLOW_CTL_MODE_BLOCK_BASED: 4138b71d385aSAndrei Emeltchenko hci_sched_acl_blk(hdev); 4139b71d385aSAndrei Emeltchenko break; 4140b71d385aSAndrei Emeltchenko } 4141b71d385aSAndrei Emeltchenko } 4142b71d385aSAndrei Emeltchenko 41431da177e4SLinus Torvalds /* Schedule SCO */ 41446039aa73SGustavo Padovan static void hci_sched_sco(struct hci_dev *hdev) 41451da177e4SLinus Torvalds { 41461da177e4SLinus Torvalds struct hci_conn *conn; 41471da177e4SLinus Torvalds struct sk_buff *skb; 41481da177e4SLinus Torvalds int quote; 41491da177e4SLinus Torvalds 41501da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 41511da177e4SLinus Torvalds 415252087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, SCO_LINK)) 415352087a79SLuiz Augusto von Dentz return; 415452087a79SLuiz Augusto von Dentz 41551da177e4SLinus Torvalds while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, "e))) { 41561da177e4SLinus Torvalds while (quote-- && (skb = skb_dequeue(&conn->data_q))) { 41571da177e4SLinus Torvalds BT_DBG("skb %p len %d", skb, skb->len); 415857d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 41591da177e4SLinus Torvalds 41601da177e4SLinus Torvalds conn->sent++; 41611da177e4SLinus Torvalds if (conn->sent == ~0) 41621da177e4SLinus Torvalds conn->sent = 0; 41631da177e4SLinus Torvalds } 41641da177e4SLinus Torvalds } 41651da177e4SLinus Torvalds } 41661da177e4SLinus Torvalds 41676039aa73SGustavo Padovan static void hci_sched_esco(struct hci_dev *hdev) 4168b6a0dc82SMarcel Holtmann { 4169b6a0dc82SMarcel Holtmann struct hci_conn *conn; 4170b6a0dc82SMarcel Holtmann struct sk_buff *skb; 4171b6a0dc82SMarcel Holtmann int quote; 4172b6a0dc82SMarcel Holtmann 4173b6a0dc82SMarcel Holtmann BT_DBG("%s", hdev->name); 4174b6a0dc82SMarcel Holtmann 417552087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, ESCO_LINK)) 417652087a79SLuiz Augusto von Dentz return; 417752087a79SLuiz Augusto von Dentz 41788fc9ced3SGustavo Padovan while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK, 41798fc9ced3SGustavo Padovan "e))) { 4180b6a0dc82SMarcel Holtmann while (quote-- && (skb = skb_dequeue(&conn->data_q))) { 4181b6a0dc82SMarcel Holtmann BT_DBG("skb %p len %d", skb, skb->len); 418257d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 4183b6a0dc82SMarcel Holtmann 4184b6a0dc82SMarcel Holtmann conn->sent++; 4185b6a0dc82SMarcel Holtmann if (conn->sent == ~0) 4186b6a0dc82SMarcel Holtmann conn->sent = 0; 4187b6a0dc82SMarcel Holtmann } 4188b6a0dc82SMarcel Holtmann } 4189b6a0dc82SMarcel Holtmann } 4190b6a0dc82SMarcel Holtmann 41916039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev) 41926ed58ec5SVille Tervo { 419373d80debSLuiz Augusto von Dentz struct hci_chan *chan; 41946ed58ec5SVille Tervo struct sk_buff *skb; 419502b20f0bSLuiz Augusto von Dentz int quote, cnt, tmp; 41966ed58ec5SVille Tervo 41976ed58ec5SVille Tervo BT_DBG("%s", hdev->name); 41986ed58ec5SVille Tervo 419952087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, LE_LINK)) 420052087a79SLuiz Augusto von Dentz return; 420152087a79SLuiz Augusto von Dentz 4202d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 42036ed58ec5SVille Tervo /* LE tx timeout must be longer than maximum 42046ed58ec5SVille Tervo * link supervision timeout (40.9 seconds) */ 4205bae1f5d9SVille Tervo if (!hdev->le_cnt && hdev->le_pkts && 42066ed58ec5SVille Tervo time_after(jiffies, hdev->le_last_tx + HZ * 45)) 4207bae1f5d9SVille Tervo hci_link_tx_to(hdev, LE_LINK); 42086ed58ec5SVille Tervo } 42096ed58ec5SVille Tervo 42106ed58ec5SVille Tervo cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt; 421102b20f0bSLuiz Augusto von Dentz tmp = cnt; 421273d80debSLuiz Augusto von Dentz while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, "e))) { 4213ec1cce24SLuiz Augusto von Dentz u32 priority = (skb_peek(&chan->data_q))->priority; 4214ec1cce24SLuiz Augusto von Dentz while (quote-- && (skb = skb_peek(&chan->data_q))) { 421573d80debSLuiz Augusto von Dentz BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 421673d80debSLuiz Augusto von Dentz skb->len, skb->priority); 42176ed58ec5SVille Tervo 4218ec1cce24SLuiz Augusto von Dentz /* Stop if priority has changed */ 4219ec1cce24SLuiz Augusto von Dentz if (skb->priority < priority) 4220ec1cce24SLuiz Augusto von Dentz break; 4221ec1cce24SLuiz Augusto von Dentz 4222ec1cce24SLuiz Augusto von Dentz skb = skb_dequeue(&chan->data_q); 4223ec1cce24SLuiz Augusto von Dentz 422457d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 42256ed58ec5SVille Tervo hdev->le_last_tx = jiffies; 42266ed58ec5SVille Tervo 42276ed58ec5SVille Tervo cnt--; 422873d80debSLuiz Augusto von Dentz chan->sent++; 422973d80debSLuiz Augusto von Dentz chan->conn->sent++; 42306ed58ec5SVille Tervo } 42316ed58ec5SVille Tervo } 423273d80debSLuiz Augusto von Dentz 42336ed58ec5SVille Tervo if (hdev->le_pkts) 42346ed58ec5SVille Tervo hdev->le_cnt = cnt; 42356ed58ec5SVille Tervo else 42366ed58ec5SVille Tervo hdev->acl_cnt = cnt; 423702b20f0bSLuiz Augusto von Dentz 423802b20f0bSLuiz Augusto von Dentz if (cnt != tmp) 423902b20f0bSLuiz Augusto von Dentz hci_prio_recalculate(hdev, LE_LINK); 42406ed58ec5SVille Tervo } 42416ed58ec5SVille Tervo 42423eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work) 42431da177e4SLinus Torvalds { 42443eff45eaSGustavo F. Padovan struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work); 42451da177e4SLinus Torvalds struct sk_buff *skb; 42461da177e4SLinus Torvalds 42476ed58ec5SVille Tervo BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt, 42486ed58ec5SVille Tervo hdev->sco_cnt, hdev->le_cnt); 42491da177e4SLinus Torvalds 4250d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 42511da177e4SLinus Torvalds /* Schedule queues and send stuff to HCI driver */ 42521da177e4SLinus Torvalds hci_sched_acl(hdev); 42531da177e4SLinus Torvalds hci_sched_sco(hdev); 4254b6a0dc82SMarcel Holtmann hci_sched_esco(hdev); 42556ed58ec5SVille Tervo hci_sched_le(hdev); 425652de599eSMarcel Holtmann } 42576ed58ec5SVille Tervo 42581da177e4SLinus Torvalds /* Send next queued raw (unknown type) packet */ 42591da177e4SLinus Torvalds while ((skb = skb_dequeue(&hdev->raw_q))) 426057d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 42611da177e4SLinus Torvalds } 42621da177e4SLinus Torvalds 426325985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */ 42641da177e4SLinus Torvalds 42651da177e4SLinus Torvalds /* ACL data packet */ 42666039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) 42671da177e4SLinus Torvalds { 42681da177e4SLinus Torvalds struct hci_acl_hdr *hdr = (void *) skb->data; 42691da177e4SLinus Torvalds struct hci_conn *conn; 42701da177e4SLinus Torvalds __u16 handle, flags; 42711da177e4SLinus Torvalds 42721da177e4SLinus Torvalds skb_pull(skb, HCI_ACL_HDR_SIZE); 42731da177e4SLinus Torvalds 42741da177e4SLinus Torvalds handle = __le16_to_cpu(hdr->handle); 42751da177e4SLinus Torvalds flags = hci_flags(handle); 42761da177e4SLinus Torvalds handle = hci_handle(handle); 42771da177e4SLinus Torvalds 4278f0e09510SAndrei Emeltchenko BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len, 4279a8c5fb1aSGustavo Padovan handle, flags); 42801da177e4SLinus Torvalds 42811da177e4SLinus Torvalds hdev->stat.acl_rx++; 42821da177e4SLinus Torvalds 42831da177e4SLinus Torvalds hci_dev_lock(hdev); 42841da177e4SLinus Torvalds conn = hci_conn_hash_lookup_handle(hdev, handle); 42851da177e4SLinus Torvalds hci_dev_unlock(hdev); 42861da177e4SLinus Torvalds 42871da177e4SLinus Torvalds if (conn) { 428865983fc7SMat Martineau hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); 428904837f64SMarcel Holtmann 42901da177e4SLinus Torvalds /* Send to upper protocol */ 4291686ebf28SUlisses Furquim l2cap_recv_acldata(conn, skb, flags); 42921da177e4SLinus Torvalds return; 42931da177e4SLinus Torvalds } else { 42941da177e4SLinus Torvalds BT_ERR("%s ACL packet for unknown connection handle %d", 42951da177e4SLinus Torvalds hdev->name, handle); 42961da177e4SLinus Torvalds } 42971da177e4SLinus Torvalds 42981da177e4SLinus Torvalds kfree_skb(skb); 42991da177e4SLinus Torvalds } 43001da177e4SLinus Torvalds 43011da177e4SLinus Torvalds /* SCO data packet */ 43026039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb) 43031da177e4SLinus Torvalds { 43041da177e4SLinus Torvalds struct hci_sco_hdr *hdr = (void *) skb->data; 43051da177e4SLinus Torvalds struct hci_conn *conn; 43061da177e4SLinus Torvalds __u16 handle; 43071da177e4SLinus Torvalds 43081da177e4SLinus Torvalds skb_pull(skb, HCI_SCO_HDR_SIZE); 43091da177e4SLinus Torvalds 43101da177e4SLinus Torvalds handle = __le16_to_cpu(hdr->handle); 43111da177e4SLinus Torvalds 4312f0e09510SAndrei Emeltchenko BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle); 43131da177e4SLinus Torvalds 43141da177e4SLinus Torvalds hdev->stat.sco_rx++; 43151da177e4SLinus Torvalds 43161da177e4SLinus Torvalds hci_dev_lock(hdev); 43171da177e4SLinus Torvalds conn = hci_conn_hash_lookup_handle(hdev, handle); 43181da177e4SLinus Torvalds hci_dev_unlock(hdev); 43191da177e4SLinus Torvalds 43201da177e4SLinus Torvalds if (conn) { 43211da177e4SLinus Torvalds /* Send to upper protocol */ 4322686ebf28SUlisses Furquim sco_recv_scodata(conn, skb); 43231da177e4SLinus Torvalds return; 43241da177e4SLinus Torvalds } else { 43251da177e4SLinus Torvalds BT_ERR("%s SCO packet for unknown connection handle %d", 43261da177e4SLinus Torvalds hdev->name, handle); 43271da177e4SLinus Torvalds } 43281da177e4SLinus Torvalds 43291da177e4SLinus Torvalds kfree_skb(skb); 43301da177e4SLinus Torvalds } 43311da177e4SLinus Torvalds 43329238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev) 43339238f36aSJohan Hedberg { 43349238f36aSJohan Hedberg struct sk_buff *skb; 43359238f36aSJohan Hedberg 43369238f36aSJohan Hedberg skb = skb_peek(&hdev->cmd_q); 43379238f36aSJohan Hedberg if (!skb) 43389238f36aSJohan Hedberg return true; 43399238f36aSJohan Hedberg 4340db6e3e8dSJohan Hedberg return bt_cb(skb)->req.start; 43419238f36aSJohan Hedberg } 43429238f36aSJohan Hedberg 434342c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev) 434442c6b129SJohan Hedberg { 434542c6b129SJohan Hedberg struct hci_command_hdr *sent; 434642c6b129SJohan Hedberg struct sk_buff *skb; 434742c6b129SJohan Hedberg u16 opcode; 434842c6b129SJohan Hedberg 434942c6b129SJohan Hedberg if (!hdev->sent_cmd) 435042c6b129SJohan Hedberg return; 435142c6b129SJohan Hedberg 435242c6b129SJohan Hedberg sent = (void *) hdev->sent_cmd->data; 435342c6b129SJohan Hedberg opcode = __le16_to_cpu(sent->opcode); 435442c6b129SJohan Hedberg if (opcode == HCI_OP_RESET) 435542c6b129SJohan Hedberg return; 435642c6b129SJohan Hedberg 435742c6b129SJohan Hedberg skb = skb_clone(hdev->sent_cmd, GFP_KERNEL); 435842c6b129SJohan Hedberg if (!skb) 435942c6b129SJohan Hedberg return; 436042c6b129SJohan Hedberg 436142c6b129SJohan Hedberg skb_queue_head(&hdev->cmd_q, skb); 436242c6b129SJohan Hedberg queue_work(hdev->workqueue, &hdev->cmd_work); 436342c6b129SJohan Hedberg } 436442c6b129SJohan Hedberg 4365e6214487SJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status, 4366e6214487SJohan Hedberg hci_req_complete_t *req_complete, 4367e6214487SJohan Hedberg hci_req_complete_skb_t *req_complete_skb) 43689238f36aSJohan Hedberg { 43699238f36aSJohan Hedberg struct sk_buff *skb; 43709238f36aSJohan Hedberg unsigned long flags; 43719238f36aSJohan Hedberg 43729238f36aSJohan Hedberg BT_DBG("opcode 0x%04x status 0x%02x", opcode, status); 43739238f36aSJohan Hedberg 437442c6b129SJohan Hedberg /* If the completed command doesn't match the last one that was 437542c6b129SJohan Hedberg * sent we need to do special handling of it. 43769238f36aSJohan Hedberg */ 437742c6b129SJohan Hedberg if (!hci_sent_cmd_data(hdev, opcode)) { 437842c6b129SJohan Hedberg /* Some CSR based controllers generate a spontaneous 437942c6b129SJohan Hedberg * reset complete event during init and any pending 438042c6b129SJohan Hedberg * command will never be completed. In such a case we 438142c6b129SJohan Hedberg * need to resend whatever was the last sent 438242c6b129SJohan Hedberg * command. 438342c6b129SJohan Hedberg */ 438442c6b129SJohan Hedberg if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET) 438542c6b129SJohan Hedberg hci_resend_last(hdev); 438642c6b129SJohan Hedberg 43879238f36aSJohan Hedberg return; 438842c6b129SJohan Hedberg } 43899238f36aSJohan Hedberg 43909238f36aSJohan Hedberg /* If the command succeeded and there's still more commands in 43919238f36aSJohan Hedberg * this request the request is not yet complete. 43929238f36aSJohan Hedberg */ 43939238f36aSJohan Hedberg if (!status && !hci_req_is_complete(hdev)) 43949238f36aSJohan Hedberg return; 43959238f36aSJohan Hedberg 43969238f36aSJohan Hedberg /* If this was the last command in a request the complete 43979238f36aSJohan Hedberg * callback would be found in hdev->sent_cmd instead of the 43989238f36aSJohan Hedberg * command queue (hdev->cmd_q). 43999238f36aSJohan Hedberg */ 4400e6214487SJohan Hedberg if (bt_cb(hdev->sent_cmd)->req.complete) { 4401e6214487SJohan Hedberg *req_complete = bt_cb(hdev->sent_cmd)->req.complete; 4402e6214487SJohan Hedberg return; 44039238f36aSJohan Hedberg } 4404e6214487SJohan Hedberg 4405e6214487SJohan Hedberg if (bt_cb(hdev->sent_cmd)->req.complete_skb) { 4406e6214487SJohan Hedberg *req_complete_skb = bt_cb(hdev->sent_cmd)->req.complete_skb; 4407e6214487SJohan Hedberg return; 440853e21fbcSJohan Hedberg } 44099238f36aSJohan Hedberg 44109238f36aSJohan Hedberg /* Remove all pending commands belonging to this request */ 44119238f36aSJohan Hedberg spin_lock_irqsave(&hdev->cmd_q.lock, flags); 44129238f36aSJohan Hedberg while ((skb = __skb_dequeue(&hdev->cmd_q))) { 4413db6e3e8dSJohan Hedberg if (bt_cb(skb)->req.start) { 44149238f36aSJohan Hedberg __skb_queue_head(&hdev->cmd_q, skb); 44159238f36aSJohan Hedberg break; 44169238f36aSJohan Hedberg } 44179238f36aSJohan Hedberg 4418e6214487SJohan Hedberg *req_complete = bt_cb(skb)->req.complete; 4419e6214487SJohan Hedberg *req_complete_skb = bt_cb(skb)->req.complete_skb; 44209238f36aSJohan Hedberg kfree_skb(skb); 44219238f36aSJohan Hedberg } 44229238f36aSJohan Hedberg spin_unlock_irqrestore(&hdev->cmd_q.lock, flags); 44239238f36aSJohan Hedberg } 44249238f36aSJohan Hedberg 4425b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work) 44261da177e4SLinus Torvalds { 4427b78752ccSMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work); 44281da177e4SLinus Torvalds struct sk_buff *skb; 44291da177e4SLinus Torvalds 44301da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 44311da177e4SLinus Torvalds 44321da177e4SLinus Torvalds while ((skb = skb_dequeue(&hdev->rx_q))) { 4433cd82e61cSMarcel Holtmann /* Send copy to monitor */ 4434cd82e61cSMarcel Holtmann hci_send_to_monitor(hdev, skb); 4435cd82e61cSMarcel Holtmann 44361da177e4SLinus Torvalds if (atomic_read(&hdev->promisc)) { 44371da177e4SLinus Torvalds /* Send copy to the sockets */ 4438470fe1b5SMarcel Holtmann hci_send_to_sock(hdev, skb); 44391da177e4SLinus Torvalds } 44401da177e4SLinus Torvalds 4441d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 44421da177e4SLinus Torvalds kfree_skb(skb); 44431da177e4SLinus Torvalds continue; 44441da177e4SLinus Torvalds } 44451da177e4SLinus Torvalds 44461da177e4SLinus Torvalds if (test_bit(HCI_INIT, &hdev->flags)) { 44471da177e4SLinus Torvalds /* Don't process data packets in this states. */ 44480d48d939SMarcel Holtmann switch (bt_cb(skb)->pkt_type) { 44491da177e4SLinus Torvalds case HCI_ACLDATA_PKT: 44501da177e4SLinus Torvalds case HCI_SCODATA_PKT: 44511da177e4SLinus Torvalds kfree_skb(skb); 44521da177e4SLinus Torvalds continue; 44533ff50b79SStephen Hemminger } 44541da177e4SLinus Torvalds } 44551da177e4SLinus Torvalds 44561da177e4SLinus Torvalds /* Process frame */ 44570d48d939SMarcel Holtmann switch (bt_cb(skb)->pkt_type) { 44581da177e4SLinus Torvalds case HCI_EVENT_PKT: 4459b78752ccSMarcel Holtmann BT_DBG("%s Event packet", hdev->name); 44601da177e4SLinus Torvalds hci_event_packet(hdev, skb); 44611da177e4SLinus Torvalds break; 44621da177e4SLinus Torvalds 44631da177e4SLinus Torvalds case HCI_ACLDATA_PKT: 44641da177e4SLinus Torvalds BT_DBG("%s ACL data packet", hdev->name); 44651da177e4SLinus Torvalds hci_acldata_packet(hdev, skb); 44661da177e4SLinus Torvalds break; 44671da177e4SLinus Torvalds 44681da177e4SLinus Torvalds case HCI_SCODATA_PKT: 44691da177e4SLinus Torvalds BT_DBG("%s SCO data packet", hdev->name); 44701da177e4SLinus Torvalds hci_scodata_packet(hdev, skb); 44711da177e4SLinus Torvalds break; 44721da177e4SLinus Torvalds 44731da177e4SLinus Torvalds default: 44741da177e4SLinus Torvalds kfree_skb(skb); 44751da177e4SLinus Torvalds break; 44761da177e4SLinus Torvalds } 44771da177e4SLinus Torvalds } 44781da177e4SLinus Torvalds } 44791da177e4SLinus Torvalds 4480c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work) 44811da177e4SLinus Torvalds { 4482c347b765SGustavo F. Padovan struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work); 44831da177e4SLinus Torvalds struct sk_buff *skb; 44841da177e4SLinus Torvalds 44852104786bSAndrei Emeltchenko BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name, 44862104786bSAndrei Emeltchenko atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q)); 44871da177e4SLinus Torvalds 44881da177e4SLinus Torvalds /* Send queued commands */ 44895a08ecceSAndrei Emeltchenko if (atomic_read(&hdev->cmd_cnt)) { 44905a08ecceSAndrei Emeltchenko skb = skb_dequeue(&hdev->cmd_q); 44915a08ecceSAndrei Emeltchenko if (!skb) 44925a08ecceSAndrei Emeltchenko return; 44935a08ecceSAndrei Emeltchenko 44941da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 44951da177e4SLinus Torvalds 4496a675d7f1SMarcel Holtmann hdev->sent_cmd = skb_clone(skb, GFP_KERNEL); 449770f23020SAndrei Emeltchenko if (hdev->sent_cmd) { 44981da177e4SLinus Torvalds atomic_dec(&hdev->cmd_cnt); 449957d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 45007bdb8a5cSSzymon Janc if (test_bit(HCI_RESET, &hdev->flags)) 450165cc2b49SMarcel Holtmann cancel_delayed_work(&hdev->cmd_timer); 45027bdb8a5cSSzymon Janc else 450365cc2b49SMarcel Holtmann schedule_delayed_work(&hdev->cmd_timer, 450465cc2b49SMarcel Holtmann HCI_CMD_TIMEOUT); 45051da177e4SLinus Torvalds } else { 45061da177e4SLinus Torvalds skb_queue_head(&hdev->cmd_q, skb); 4507c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 45081da177e4SLinus Torvalds } 45091da177e4SLinus Torvalds } 45101da177e4SLinus Torvalds } 4511