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 int err; 984b4148e9SMarcel Holtmann 994b4148e9SMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) 1004b4148e9SMarcel Holtmann return -ENETDOWN; 1014b4148e9SMarcel Holtmann 1024b4148e9SMarcel Holtmann if (copy_from_user(buf, user_buf, buf_size)) 1034b4148e9SMarcel Holtmann return -EFAULT; 1044b4148e9SMarcel Holtmann 1054b4148e9SMarcel Holtmann buf[buf_size] = '\0'; 1064b4148e9SMarcel Holtmann if (strtobool(buf, &enable)) 1074b4148e9SMarcel Holtmann return -EINVAL; 1084b4148e9SMarcel Holtmann 109b7cb93e5SMarcel Holtmann if (enable == hci_dev_test_flag(hdev, HCI_DUT_MODE)) 1104b4148e9SMarcel Holtmann return -EALREADY; 1114b4148e9SMarcel Holtmann 1124b4148e9SMarcel Holtmann hci_req_lock(hdev); 1134b4148e9SMarcel Holtmann if (enable) 1144b4148e9SMarcel Holtmann skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL, 1154b4148e9SMarcel Holtmann HCI_CMD_TIMEOUT); 1164b4148e9SMarcel Holtmann else 1174b4148e9SMarcel Holtmann skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, 1184b4148e9SMarcel Holtmann HCI_CMD_TIMEOUT); 1194b4148e9SMarcel Holtmann hci_req_unlock(hdev); 1204b4148e9SMarcel Holtmann 1214b4148e9SMarcel Holtmann if (IS_ERR(skb)) 1224b4148e9SMarcel Holtmann return PTR_ERR(skb); 1234b4148e9SMarcel Holtmann 1244b4148e9SMarcel Holtmann err = -bt_to_errno(skb->data[0]); 1254b4148e9SMarcel Holtmann kfree_skb(skb); 1264b4148e9SMarcel Holtmann 1274b4148e9SMarcel Holtmann if (err < 0) 1284b4148e9SMarcel Holtmann return err; 1294b4148e9SMarcel Holtmann 130b7cb93e5SMarcel Holtmann hci_dev_change_flag(hdev, HCI_DUT_MODE); 1314b4148e9SMarcel Holtmann 1324b4148e9SMarcel Holtmann return count; 1334b4148e9SMarcel Holtmann } 1344b4148e9SMarcel Holtmann 1354b4148e9SMarcel Holtmann static const struct file_operations dut_mode_fops = { 1364b4148e9SMarcel Holtmann .open = simple_open, 1374b4148e9SMarcel Holtmann .read = dut_mode_read, 1384b4148e9SMarcel Holtmann .write = dut_mode_write, 1394b4148e9SMarcel Holtmann .llseek = default_llseek, 1404b4148e9SMarcel Holtmann }; 1414b4148e9SMarcel Holtmann 1421da177e4SLinus Torvalds /* ---- HCI requests ---- */ 1431da177e4SLinus Torvalds 144f60cb305SJohan Hedberg static void hci_req_sync_complete(struct hci_dev *hdev, u8 result, u16 opcode, 145f60cb305SJohan Hedberg struct sk_buff *skb) 1461da177e4SLinus Torvalds { 14742c6b129SJohan Hedberg BT_DBG("%s result 0x%2.2x", hdev->name, result); 14875fb0e32SJohan Hedberg 1491da177e4SLinus Torvalds if (hdev->req_status == HCI_REQ_PEND) { 1501da177e4SLinus Torvalds hdev->req_result = result; 1511da177e4SLinus Torvalds hdev->req_status = HCI_REQ_DONE; 152f60cb305SJohan Hedberg if (skb) 153f60cb305SJohan Hedberg hdev->req_skb = skb_get(skb); 1541da177e4SLinus Torvalds wake_up_interruptible(&hdev->req_wait_q); 1551da177e4SLinus Torvalds } 1561da177e4SLinus Torvalds } 1571da177e4SLinus Torvalds 1581da177e4SLinus Torvalds static void hci_req_cancel(struct hci_dev *hdev, int err) 1591da177e4SLinus Torvalds { 1601da177e4SLinus Torvalds BT_DBG("%s err 0x%2.2x", hdev->name, err); 1611da177e4SLinus Torvalds 1621da177e4SLinus Torvalds if (hdev->req_status == HCI_REQ_PEND) { 1631da177e4SLinus Torvalds hdev->req_result = err; 1641da177e4SLinus Torvalds hdev->req_status = HCI_REQ_CANCELED; 1651da177e4SLinus Torvalds wake_up_interruptible(&hdev->req_wait_q); 1661da177e4SLinus Torvalds } 1671da177e4SLinus Torvalds } 1681da177e4SLinus Torvalds 1697b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, 17007dc93ddSJohan Hedberg const void *param, u8 event, u32 timeout) 17175e84b7cSJohan Hedberg { 17275e84b7cSJohan Hedberg DECLARE_WAITQUEUE(wait, current); 17375e84b7cSJohan Hedberg struct hci_request req; 174f60cb305SJohan Hedberg struct sk_buff *skb; 17575e84b7cSJohan Hedberg int err = 0; 17675e84b7cSJohan Hedberg 17775e84b7cSJohan Hedberg BT_DBG("%s", hdev->name); 17875e84b7cSJohan Hedberg 17975e84b7cSJohan Hedberg hci_req_init(&req, hdev); 18075e84b7cSJohan Hedberg 1817b1abbbeSJohan Hedberg hci_req_add_ev(&req, opcode, plen, param, event); 18275e84b7cSJohan Hedberg 18375e84b7cSJohan Hedberg hdev->req_status = HCI_REQ_PEND; 18475e84b7cSJohan Hedberg 18575e84b7cSJohan Hedberg add_wait_queue(&hdev->req_wait_q, &wait); 18675e84b7cSJohan Hedberg set_current_state(TASK_INTERRUPTIBLE); 18775e84b7cSJohan Hedberg 188f60cb305SJohan Hedberg err = hci_req_run_skb(&req, hci_req_sync_complete); 189039fada5SChan-yeol Park if (err < 0) { 190039fada5SChan-yeol Park remove_wait_queue(&hdev->req_wait_q, &wait); 19122a3ceabSJohan Hedberg set_current_state(TASK_RUNNING); 192039fada5SChan-yeol Park return ERR_PTR(err); 193039fada5SChan-yeol Park } 194039fada5SChan-yeol Park 19575e84b7cSJohan Hedberg schedule_timeout(timeout); 19675e84b7cSJohan Hedberg 19775e84b7cSJohan Hedberg remove_wait_queue(&hdev->req_wait_q, &wait); 19875e84b7cSJohan Hedberg 19975e84b7cSJohan Hedberg if (signal_pending(current)) 20075e84b7cSJohan Hedberg return ERR_PTR(-EINTR); 20175e84b7cSJohan Hedberg 20275e84b7cSJohan Hedberg switch (hdev->req_status) { 20375e84b7cSJohan Hedberg case HCI_REQ_DONE: 20475e84b7cSJohan Hedberg err = -bt_to_errno(hdev->req_result); 20575e84b7cSJohan Hedberg break; 20675e84b7cSJohan Hedberg 20775e84b7cSJohan Hedberg case HCI_REQ_CANCELED: 20875e84b7cSJohan Hedberg err = -hdev->req_result; 20975e84b7cSJohan Hedberg break; 21075e84b7cSJohan Hedberg 21175e84b7cSJohan Hedberg default: 21275e84b7cSJohan Hedberg err = -ETIMEDOUT; 21375e84b7cSJohan Hedberg break; 21475e84b7cSJohan Hedberg } 21575e84b7cSJohan Hedberg 21675e84b7cSJohan Hedberg hdev->req_status = hdev->req_result = 0; 217f60cb305SJohan Hedberg skb = hdev->req_skb; 218f60cb305SJohan Hedberg hdev->req_skb = NULL; 21975e84b7cSJohan Hedberg 22075e84b7cSJohan Hedberg BT_DBG("%s end: err %d", hdev->name, err); 22175e84b7cSJohan Hedberg 222f60cb305SJohan Hedberg if (err < 0) { 223f60cb305SJohan Hedberg kfree_skb(skb); 22475e84b7cSJohan Hedberg return ERR_PTR(err); 225f60cb305SJohan Hedberg } 22675e84b7cSJohan Hedberg 227757aa0b5SJohan Hedberg if (!skb) 228757aa0b5SJohan Hedberg return ERR_PTR(-ENODATA); 229757aa0b5SJohan Hedberg 230757aa0b5SJohan Hedberg return skb; 2317b1abbbeSJohan Hedberg } 2327b1abbbeSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync_ev); 2337b1abbbeSJohan Hedberg 2347b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, 23507dc93ddSJohan Hedberg const void *param, u32 timeout) 2367b1abbbeSJohan Hedberg { 2377b1abbbeSJohan Hedberg return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout); 23875e84b7cSJohan Hedberg } 23975e84b7cSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync); 24075e84b7cSJohan Hedberg 2411da177e4SLinus Torvalds /* Execute request and wait for completion. */ 24201178cd4SJohan Hedberg static int __hci_req_sync(struct hci_dev *hdev, 24342c6b129SJohan Hedberg void (*func)(struct hci_request *req, 24442c6b129SJohan Hedberg unsigned long opt), 2451da177e4SLinus Torvalds unsigned long opt, __u32 timeout) 2461da177e4SLinus Torvalds { 24742c6b129SJohan Hedberg struct hci_request req; 2481da177e4SLinus Torvalds DECLARE_WAITQUEUE(wait, current); 2491da177e4SLinus Torvalds int err = 0; 2501da177e4SLinus Torvalds 2511da177e4SLinus Torvalds BT_DBG("%s start", hdev->name); 2521da177e4SLinus Torvalds 25342c6b129SJohan Hedberg hci_req_init(&req, hdev); 25442c6b129SJohan Hedberg 2551da177e4SLinus Torvalds hdev->req_status = HCI_REQ_PEND; 2561da177e4SLinus Torvalds 25742c6b129SJohan Hedberg func(&req, opt); 25853cce22dSJohan Hedberg 259039fada5SChan-yeol Park add_wait_queue(&hdev->req_wait_q, &wait); 260039fada5SChan-yeol Park set_current_state(TASK_INTERRUPTIBLE); 261039fada5SChan-yeol Park 262f60cb305SJohan Hedberg err = hci_req_run_skb(&req, hci_req_sync_complete); 26342c6b129SJohan Hedberg if (err < 0) { 26453cce22dSJohan Hedberg hdev->req_status = 0; 265920c8300SAndre Guedes 266039fada5SChan-yeol Park remove_wait_queue(&hdev->req_wait_q, &wait); 26722a3ceabSJohan Hedberg set_current_state(TASK_RUNNING); 268039fada5SChan-yeol Park 269920c8300SAndre Guedes /* ENODATA means the HCI request command queue is empty. 270920c8300SAndre Guedes * This can happen when a request with conditionals doesn't 271920c8300SAndre Guedes * trigger any commands to be sent. This is normal behavior 272920c8300SAndre Guedes * and should not trigger an error return. 27342c6b129SJohan Hedberg */ 274920c8300SAndre Guedes if (err == -ENODATA) 27542c6b129SJohan Hedberg return 0; 276920c8300SAndre Guedes 277920c8300SAndre Guedes return err; 27853cce22dSJohan Hedberg } 27953cce22dSJohan Hedberg 2801da177e4SLinus Torvalds schedule_timeout(timeout); 2811da177e4SLinus Torvalds 2821da177e4SLinus Torvalds remove_wait_queue(&hdev->req_wait_q, &wait); 2831da177e4SLinus Torvalds 2841da177e4SLinus Torvalds if (signal_pending(current)) 2851da177e4SLinus Torvalds return -EINTR; 2861da177e4SLinus Torvalds 2871da177e4SLinus Torvalds switch (hdev->req_status) { 2881da177e4SLinus Torvalds case HCI_REQ_DONE: 289e175072fSJoe Perches err = -bt_to_errno(hdev->req_result); 2901da177e4SLinus Torvalds break; 2911da177e4SLinus Torvalds 2921da177e4SLinus Torvalds case HCI_REQ_CANCELED: 2931da177e4SLinus Torvalds err = -hdev->req_result; 2941da177e4SLinus Torvalds break; 2951da177e4SLinus Torvalds 2961da177e4SLinus Torvalds default: 2971da177e4SLinus Torvalds err = -ETIMEDOUT; 2981da177e4SLinus Torvalds break; 2993ff50b79SStephen Hemminger } 3001da177e4SLinus Torvalds 301a5040efaSJohan Hedberg hdev->req_status = hdev->req_result = 0; 3021da177e4SLinus Torvalds 3031da177e4SLinus Torvalds BT_DBG("%s end: err %d", hdev->name, err); 3041da177e4SLinus Torvalds 3051da177e4SLinus Torvalds return err; 3061da177e4SLinus Torvalds } 3071da177e4SLinus Torvalds 30801178cd4SJohan Hedberg static int hci_req_sync(struct hci_dev *hdev, 30942c6b129SJohan Hedberg void (*req)(struct hci_request *req, 31042c6b129SJohan Hedberg unsigned long opt), 3111da177e4SLinus Torvalds unsigned long opt, __u32 timeout) 3121da177e4SLinus Torvalds { 3131da177e4SLinus Torvalds int ret; 3141da177e4SLinus Torvalds 3157c6a329eSMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) 3167c6a329eSMarcel Holtmann return -ENETDOWN; 3177c6a329eSMarcel Holtmann 3181da177e4SLinus Torvalds /* Serialize all requests */ 3191da177e4SLinus Torvalds hci_req_lock(hdev); 32001178cd4SJohan Hedberg ret = __hci_req_sync(hdev, req, opt, timeout); 3211da177e4SLinus Torvalds hci_req_unlock(hdev); 3221da177e4SLinus Torvalds 3231da177e4SLinus Torvalds return ret; 3241da177e4SLinus Torvalds } 3251da177e4SLinus Torvalds 32642c6b129SJohan Hedberg static void hci_reset_req(struct hci_request *req, unsigned long opt) 3271da177e4SLinus Torvalds { 32842c6b129SJohan Hedberg BT_DBG("%s %ld", req->hdev->name, opt); 3291da177e4SLinus Torvalds 3301da177e4SLinus Torvalds /* Reset device */ 33142c6b129SJohan Hedberg set_bit(HCI_RESET, &req->hdev->flags); 33242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_RESET, 0, NULL); 3331da177e4SLinus Torvalds } 3341da177e4SLinus Torvalds 33542c6b129SJohan Hedberg static void bredr_init(struct hci_request *req) 3361da177e4SLinus Torvalds { 33742c6b129SJohan Hedberg req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED; 3382455a3eaSAndrei Emeltchenko 3391da177e4SLinus Torvalds /* Read Local Supported Features */ 34042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); 3411da177e4SLinus Torvalds 3421143e5a6SMarcel Holtmann /* Read Local Version */ 34342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 3442177bab5SJohan Hedberg 3452177bab5SJohan Hedberg /* Read BD Address */ 34642c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL); 3471da177e4SLinus Torvalds } 3481da177e4SLinus Torvalds 3490af801b9SJohan Hedberg static void amp_init1(struct hci_request *req) 350e61ef499SAndrei Emeltchenko { 35142c6b129SJohan Hedberg req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED; 3522455a3eaSAndrei Emeltchenko 353e61ef499SAndrei Emeltchenko /* Read Local Version */ 35442c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 3556bcbc489SAndrei Emeltchenko 356f6996cfeSMarcel Holtmann /* Read Local Supported Commands */ 357f6996cfeSMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); 358f6996cfeSMarcel Holtmann 3596bcbc489SAndrei Emeltchenko /* Read Local AMP Info */ 36042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL); 361e71dfabaSAndrei Emeltchenko 362e71dfabaSAndrei Emeltchenko /* Read Data Blk size */ 36342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL); 3647528ca1cSMarcel Holtmann 365f38ba941SMarcel Holtmann /* Read Flow Control Mode */ 366f38ba941SMarcel Holtmann hci_req_add(req, HCI_OP_READ_FLOW_CONTROL_MODE, 0, NULL); 367f38ba941SMarcel Holtmann 3687528ca1cSMarcel Holtmann /* Read Location Data */ 3697528ca1cSMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCATION_DATA, 0, NULL); 370e61ef499SAndrei Emeltchenko } 371e61ef499SAndrei Emeltchenko 3720af801b9SJohan Hedberg static void amp_init2(struct hci_request *req) 3730af801b9SJohan Hedberg { 3740af801b9SJohan Hedberg /* Read Local Supported Features. Not all AMP controllers 3750af801b9SJohan Hedberg * support this so it's placed conditionally in the second 3760af801b9SJohan Hedberg * stage init. 3770af801b9SJohan Hedberg */ 3780af801b9SJohan Hedberg if (req->hdev->commands[14] & 0x20) 3790af801b9SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); 3800af801b9SJohan Hedberg } 3810af801b9SJohan Hedberg 38242c6b129SJohan Hedberg static void hci_init1_req(struct hci_request *req, unsigned long opt) 383e61ef499SAndrei Emeltchenko { 38442c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 385e61ef499SAndrei Emeltchenko 386e61ef499SAndrei Emeltchenko BT_DBG("%s %ld", hdev->name, opt); 387e61ef499SAndrei Emeltchenko 38811778716SAndrei Emeltchenko /* Reset */ 38911778716SAndrei Emeltchenko if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) 39042c6b129SJohan Hedberg hci_reset_req(req, 0); 39111778716SAndrei Emeltchenko 392e61ef499SAndrei Emeltchenko switch (hdev->dev_type) { 393e61ef499SAndrei Emeltchenko case HCI_BREDR: 39442c6b129SJohan Hedberg bredr_init(req); 395e61ef499SAndrei Emeltchenko break; 396e61ef499SAndrei Emeltchenko 397e61ef499SAndrei Emeltchenko case HCI_AMP: 3980af801b9SJohan Hedberg amp_init1(req); 399e61ef499SAndrei Emeltchenko break; 400e61ef499SAndrei Emeltchenko 401e61ef499SAndrei Emeltchenko default: 402e61ef499SAndrei Emeltchenko BT_ERR("Unknown device type %d", hdev->dev_type); 403e61ef499SAndrei Emeltchenko break; 404e61ef499SAndrei Emeltchenko } 405e61ef499SAndrei Emeltchenko } 406e61ef499SAndrei Emeltchenko 40742c6b129SJohan Hedberg static void bredr_setup(struct hci_request *req) 4082177bab5SJohan Hedberg { 4092177bab5SJohan Hedberg __le16 param; 4102177bab5SJohan Hedberg __u8 flt_type; 4112177bab5SJohan Hedberg 4122177bab5SJohan Hedberg /* Read Buffer Size (ACL mtu, max pkt, etc.) */ 41342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL); 4142177bab5SJohan Hedberg 4152177bab5SJohan Hedberg /* Read Class of Device */ 41642c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL); 4172177bab5SJohan Hedberg 4182177bab5SJohan Hedberg /* Read Local Name */ 41942c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL); 4202177bab5SJohan Hedberg 4212177bab5SJohan Hedberg /* Read Voice Setting */ 42242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL); 4232177bab5SJohan Hedberg 424b4cb9fb2SMarcel Holtmann /* Read Number of Supported IAC */ 425b4cb9fb2SMarcel Holtmann hci_req_add(req, HCI_OP_READ_NUM_SUPPORTED_IAC, 0, NULL); 426b4cb9fb2SMarcel Holtmann 4274b836f39SMarcel Holtmann /* Read Current IAC LAP */ 4284b836f39SMarcel Holtmann hci_req_add(req, HCI_OP_READ_CURRENT_IAC_LAP, 0, NULL); 4294b836f39SMarcel Holtmann 4302177bab5SJohan Hedberg /* Clear Event Filters */ 4312177bab5SJohan Hedberg flt_type = HCI_FLT_CLEAR_ALL; 43242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type); 4332177bab5SJohan Hedberg 4342177bab5SJohan Hedberg /* Connection accept timeout ~20 secs */ 435dcf4adbfSJoe Perches param = cpu_to_le16(0x7d00); 43642c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); 4372177bab5SJohan Hedberg } 4382177bab5SJohan Hedberg 43942c6b129SJohan Hedberg static void le_setup(struct hci_request *req) 4402177bab5SJohan Hedberg { 441c73eee91SJohan Hedberg struct hci_dev *hdev = req->hdev; 442c73eee91SJohan Hedberg 4432177bab5SJohan Hedberg /* Read LE Buffer Size */ 44442c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL); 4452177bab5SJohan Hedberg 4462177bab5SJohan Hedberg /* Read LE Local Supported Features */ 44742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL); 4482177bab5SJohan Hedberg 449747d3f03SMarcel Holtmann /* Read LE Supported States */ 450747d3f03SMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL); 451747d3f03SMarcel Holtmann 4522177bab5SJohan Hedberg /* Read LE White List Size */ 45342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL); 4542177bab5SJohan Hedberg 455747d3f03SMarcel Holtmann /* Clear LE White List */ 456747d3f03SMarcel Holtmann hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL); 457c73eee91SJohan Hedberg 458c73eee91SJohan Hedberg /* LE-only controllers have LE implicitly enabled */ 459c73eee91SJohan Hedberg if (!lmp_bredr_capable(hdev)) 460a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_LE_ENABLED); 4612177bab5SJohan Hedberg } 4622177bab5SJohan Hedberg 46342c6b129SJohan Hedberg static void hci_setup_event_mask(struct hci_request *req) 4642177bab5SJohan Hedberg { 46542c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 46642c6b129SJohan Hedberg 4672177bab5SJohan Hedberg /* The second byte is 0xff instead of 0x9f (two reserved bits 4682177bab5SJohan Hedberg * disabled) since a Broadcom 1.2 dongle doesn't respond to the 4692177bab5SJohan Hedberg * command otherwise. 4702177bab5SJohan Hedberg */ 4712177bab5SJohan Hedberg u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 }; 4722177bab5SJohan Hedberg 4732177bab5SJohan Hedberg /* CSR 1.1 dongles does not accept any bitfield so don't try to set 4742177bab5SJohan Hedberg * any event mask for pre 1.2 devices. 4752177bab5SJohan Hedberg */ 4762177bab5SJohan Hedberg if (hdev->hci_ver < BLUETOOTH_VER_1_2) 4772177bab5SJohan Hedberg return; 4782177bab5SJohan Hedberg 4792177bab5SJohan Hedberg if (lmp_bredr_capable(hdev)) { 4802177bab5SJohan Hedberg events[4] |= 0x01; /* Flow Specification Complete */ 4812177bab5SJohan Hedberg events[4] |= 0x02; /* Inquiry Result with RSSI */ 4822177bab5SJohan Hedberg events[4] |= 0x04; /* Read Remote Extended Features Complete */ 4832177bab5SJohan Hedberg events[5] |= 0x08; /* Synchronous Connection Complete */ 4842177bab5SJohan Hedberg events[5] |= 0x10; /* Synchronous Connection Changed */ 485c7882cbdSMarcel Holtmann } else { 486c7882cbdSMarcel Holtmann /* Use a different default for LE-only devices */ 487c7882cbdSMarcel Holtmann memset(events, 0, sizeof(events)); 488c7882cbdSMarcel Holtmann events[0] |= 0x10; /* Disconnection Complete */ 489c7882cbdSMarcel Holtmann events[1] |= 0x08; /* Read Remote Version Information Complete */ 490c7882cbdSMarcel Holtmann events[1] |= 0x20; /* Command Complete */ 491c7882cbdSMarcel Holtmann events[1] |= 0x40; /* Command Status */ 492c7882cbdSMarcel Holtmann events[1] |= 0x80; /* Hardware Error */ 493c7882cbdSMarcel Holtmann events[2] |= 0x04; /* Number of Completed Packets */ 494c7882cbdSMarcel Holtmann events[3] |= 0x02; /* Data Buffer Overflow */ 4950da71f1bSMarcel Holtmann 4960da71f1bSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_ENCRYPTION) { 4970da71f1bSMarcel Holtmann events[0] |= 0x80; /* Encryption Change */ 498c7882cbdSMarcel Holtmann events[5] |= 0x80; /* Encryption Key Refresh Complete */ 4992177bab5SJohan Hedberg } 5000da71f1bSMarcel Holtmann } 5012177bab5SJohan Hedberg 5022177bab5SJohan Hedberg if (lmp_inq_rssi_capable(hdev)) 5032177bab5SJohan Hedberg events[4] |= 0x02; /* Inquiry Result with RSSI */ 5042177bab5SJohan Hedberg 5052177bab5SJohan Hedberg if (lmp_sniffsubr_capable(hdev)) 5062177bab5SJohan Hedberg events[5] |= 0x20; /* Sniff Subrating */ 5072177bab5SJohan Hedberg 5082177bab5SJohan Hedberg if (lmp_pause_enc_capable(hdev)) 5092177bab5SJohan Hedberg events[5] |= 0x80; /* Encryption Key Refresh Complete */ 5102177bab5SJohan Hedberg 5112177bab5SJohan Hedberg if (lmp_ext_inq_capable(hdev)) 5122177bab5SJohan Hedberg events[5] |= 0x40; /* Extended Inquiry Result */ 5132177bab5SJohan Hedberg 5142177bab5SJohan Hedberg if (lmp_no_flush_capable(hdev)) 5152177bab5SJohan Hedberg events[7] |= 0x01; /* Enhanced Flush Complete */ 5162177bab5SJohan Hedberg 5172177bab5SJohan Hedberg if (lmp_lsto_capable(hdev)) 5182177bab5SJohan Hedberg events[6] |= 0x80; /* Link Supervision Timeout Changed */ 5192177bab5SJohan Hedberg 5202177bab5SJohan Hedberg if (lmp_ssp_capable(hdev)) { 5212177bab5SJohan Hedberg events[6] |= 0x01; /* IO Capability Request */ 5222177bab5SJohan Hedberg events[6] |= 0x02; /* IO Capability Response */ 5232177bab5SJohan Hedberg events[6] |= 0x04; /* User Confirmation Request */ 5242177bab5SJohan Hedberg events[6] |= 0x08; /* User Passkey Request */ 5252177bab5SJohan Hedberg events[6] |= 0x10; /* Remote OOB Data Request */ 5262177bab5SJohan Hedberg events[6] |= 0x20; /* Simple Pairing Complete */ 5272177bab5SJohan Hedberg events[7] |= 0x04; /* User Passkey Notification */ 5282177bab5SJohan Hedberg events[7] |= 0x08; /* Keypress Notification */ 5292177bab5SJohan Hedberg events[7] |= 0x10; /* Remote Host Supported 5302177bab5SJohan Hedberg * Features Notification 5312177bab5SJohan Hedberg */ 5322177bab5SJohan Hedberg } 5332177bab5SJohan Hedberg 5342177bab5SJohan Hedberg if (lmp_le_capable(hdev)) 5352177bab5SJohan Hedberg events[7] |= 0x20; /* LE Meta-Event */ 5362177bab5SJohan Hedberg 53742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events); 5382177bab5SJohan Hedberg } 5392177bab5SJohan Hedberg 54042c6b129SJohan Hedberg static void hci_init2_req(struct hci_request *req, unsigned long opt) 5412177bab5SJohan Hedberg { 54242c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 54342c6b129SJohan Hedberg 5440af801b9SJohan Hedberg if (hdev->dev_type == HCI_AMP) 5450af801b9SJohan Hedberg return amp_init2(req); 5460af801b9SJohan Hedberg 5472177bab5SJohan Hedberg if (lmp_bredr_capable(hdev)) 54842c6b129SJohan Hedberg bredr_setup(req); 54956f87901SJohan Hedberg else 550a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); 5512177bab5SJohan Hedberg 5522177bab5SJohan Hedberg if (lmp_le_capable(hdev)) 55342c6b129SJohan Hedberg le_setup(req); 5542177bab5SJohan Hedberg 5550f3adeaeSMarcel Holtmann /* All Bluetooth 1.2 and later controllers should support the 5560f3adeaeSMarcel Holtmann * HCI command for reading the local supported commands. 5570f3adeaeSMarcel Holtmann * 5580f3adeaeSMarcel Holtmann * Unfortunately some controllers indicate Bluetooth 1.2 support, 5590f3adeaeSMarcel Holtmann * but do not have support for this command. If that is the case, 5600f3adeaeSMarcel Holtmann * the driver can quirk the behavior and skip reading the local 5610f3adeaeSMarcel Holtmann * supported commands. 5623f8e2d75SJohan Hedberg */ 5630f3adeaeSMarcel Holtmann if (hdev->hci_ver > BLUETOOTH_VER_1_1 && 5640f3adeaeSMarcel Holtmann !test_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks)) 56542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); 5662177bab5SJohan Hedberg 5672177bab5SJohan Hedberg if (lmp_ssp_capable(hdev)) { 56857af75a8SMarcel Holtmann /* When SSP is available, then the host features page 56957af75a8SMarcel Holtmann * should also be available as well. However some 57057af75a8SMarcel Holtmann * controllers list the max_page as 0 as long as SSP 57157af75a8SMarcel Holtmann * has not been enabled. To achieve proper debugging 57257af75a8SMarcel Holtmann * output, force the minimum max_page to 1 at least. 57357af75a8SMarcel Holtmann */ 57457af75a8SMarcel Holtmann hdev->max_page = 0x01; 57557af75a8SMarcel Holtmann 576d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { 5772177bab5SJohan Hedberg u8 mode = 0x01; 578574ea3c7SMarcel Holtmann 57942c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_SSP_MODE, 5802177bab5SJohan Hedberg sizeof(mode), &mode); 5812177bab5SJohan Hedberg } else { 5822177bab5SJohan Hedberg struct hci_cp_write_eir cp; 5832177bab5SJohan Hedberg 5842177bab5SJohan Hedberg memset(hdev->eir, 0, sizeof(hdev->eir)); 5852177bab5SJohan Hedberg memset(&cp, 0, sizeof(cp)); 5862177bab5SJohan Hedberg 58742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp); 5882177bab5SJohan Hedberg } 5892177bab5SJohan Hedberg } 5902177bab5SJohan Hedberg 591043ec9bfSMarcel Holtmann if (lmp_inq_rssi_capable(hdev) || 592043ec9bfSMarcel Holtmann test_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks)) { 59304422da9SMarcel Holtmann u8 mode; 59404422da9SMarcel Holtmann 59504422da9SMarcel Holtmann /* If Extended Inquiry Result events are supported, then 59604422da9SMarcel Holtmann * they are clearly preferred over Inquiry Result with RSSI 59704422da9SMarcel Holtmann * events. 59804422da9SMarcel Holtmann */ 59904422da9SMarcel Holtmann mode = lmp_ext_inq_capable(hdev) ? 0x02 : 0x01; 60004422da9SMarcel Holtmann 60104422da9SMarcel Holtmann hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode); 60204422da9SMarcel Holtmann } 6032177bab5SJohan Hedberg 6042177bab5SJohan Hedberg if (lmp_inq_tx_pwr_capable(hdev)) 60542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL); 6062177bab5SJohan Hedberg 6072177bab5SJohan Hedberg if (lmp_ext_feat_capable(hdev)) { 6082177bab5SJohan Hedberg struct hci_cp_read_local_ext_features cp; 6092177bab5SJohan Hedberg 6102177bab5SJohan Hedberg cp.page = 0x01; 61142c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES, 61242c6b129SJohan Hedberg sizeof(cp), &cp); 6132177bab5SJohan Hedberg } 6142177bab5SJohan Hedberg 615d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { 6162177bab5SJohan Hedberg u8 enable = 1; 61742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable), 6182177bab5SJohan Hedberg &enable); 6192177bab5SJohan Hedberg } 6202177bab5SJohan Hedberg } 6212177bab5SJohan Hedberg 62242c6b129SJohan Hedberg static void hci_setup_link_policy(struct hci_request *req) 6232177bab5SJohan Hedberg { 62442c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 6252177bab5SJohan Hedberg struct hci_cp_write_def_link_policy cp; 6262177bab5SJohan Hedberg u16 link_policy = 0; 6272177bab5SJohan Hedberg 6282177bab5SJohan Hedberg if (lmp_rswitch_capable(hdev)) 6292177bab5SJohan Hedberg link_policy |= HCI_LP_RSWITCH; 6302177bab5SJohan Hedberg if (lmp_hold_capable(hdev)) 6312177bab5SJohan Hedberg link_policy |= HCI_LP_HOLD; 6322177bab5SJohan Hedberg if (lmp_sniff_capable(hdev)) 6332177bab5SJohan Hedberg link_policy |= HCI_LP_SNIFF; 6342177bab5SJohan Hedberg if (lmp_park_capable(hdev)) 6352177bab5SJohan Hedberg link_policy |= HCI_LP_PARK; 6362177bab5SJohan Hedberg 6372177bab5SJohan Hedberg cp.policy = cpu_to_le16(link_policy); 63842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp); 6392177bab5SJohan Hedberg } 6402177bab5SJohan Hedberg 64142c6b129SJohan Hedberg static void hci_set_le_support(struct hci_request *req) 6422177bab5SJohan Hedberg { 64342c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 6442177bab5SJohan Hedberg struct hci_cp_write_le_host_supported cp; 6452177bab5SJohan Hedberg 646c73eee91SJohan Hedberg /* LE-only devices do not support explicit enablement */ 647c73eee91SJohan Hedberg if (!lmp_bredr_capable(hdev)) 648c73eee91SJohan Hedberg return; 649c73eee91SJohan Hedberg 6502177bab5SJohan Hedberg memset(&cp, 0, sizeof(cp)); 6512177bab5SJohan Hedberg 652d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { 6532177bab5SJohan Hedberg cp.le = 0x01; 65432226e4fSMarcel Holtmann cp.simul = 0x00; 6552177bab5SJohan Hedberg } 6562177bab5SJohan Hedberg 6572177bab5SJohan Hedberg if (cp.le != lmp_host_le_capable(hdev)) 65842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp), 6592177bab5SJohan Hedberg &cp); 6602177bab5SJohan Hedberg } 6612177bab5SJohan Hedberg 662d62e6d67SJohan Hedberg static void hci_set_event_mask_page_2(struct hci_request *req) 663d62e6d67SJohan Hedberg { 664d62e6d67SJohan Hedberg struct hci_dev *hdev = req->hdev; 665d62e6d67SJohan Hedberg u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 666d62e6d67SJohan Hedberg 667d62e6d67SJohan Hedberg /* If Connectionless Slave Broadcast master role is supported 668d62e6d67SJohan Hedberg * enable all necessary events for it. 669d62e6d67SJohan Hedberg */ 67053b834d2SMarcel Holtmann if (lmp_csb_master_capable(hdev)) { 671d62e6d67SJohan Hedberg events[1] |= 0x40; /* Triggered Clock Capture */ 672d62e6d67SJohan Hedberg events[1] |= 0x80; /* Synchronization Train Complete */ 673d62e6d67SJohan Hedberg events[2] |= 0x10; /* Slave Page Response Timeout */ 674d62e6d67SJohan Hedberg events[2] |= 0x20; /* CSB Channel Map Change */ 675d62e6d67SJohan Hedberg } 676d62e6d67SJohan Hedberg 677d62e6d67SJohan Hedberg /* If Connectionless Slave Broadcast slave role is supported 678d62e6d67SJohan Hedberg * enable all necessary events for it. 679d62e6d67SJohan Hedberg */ 68053b834d2SMarcel Holtmann if (lmp_csb_slave_capable(hdev)) { 681d62e6d67SJohan Hedberg events[2] |= 0x01; /* Synchronization Train Received */ 682d62e6d67SJohan Hedberg events[2] |= 0x02; /* CSB Receive */ 683d62e6d67SJohan Hedberg events[2] |= 0x04; /* CSB Timeout */ 684d62e6d67SJohan Hedberg events[2] |= 0x08; /* Truncated Page Complete */ 685d62e6d67SJohan Hedberg } 686d62e6d67SJohan Hedberg 68740c59fcbSMarcel Holtmann /* Enable Authenticated Payload Timeout Expired event if supported */ 688cd7ca0ecSMarcel Holtmann if (lmp_ping_capable(hdev) || hdev->le_features[0] & HCI_LE_PING) 68940c59fcbSMarcel Holtmann events[2] |= 0x80; 69040c59fcbSMarcel Holtmann 691d62e6d67SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2, sizeof(events), events); 692d62e6d67SJohan Hedberg } 693d62e6d67SJohan Hedberg 69442c6b129SJohan Hedberg static void hci_init3_req(struct hci_request *req, unsigned long opt) 6952177bab5SJohan Hedberg { 69642c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 697d2c5d77fSJohan Hedberg u8 p; 69842c6b129SJohan Hedberg 6990da71f1bSMarcel Holtmann hci_setup_event_mask(req); 7000da71f1bSMarcel Holtmann 70148ce62c4SMarcel Holtmann if (hdev->commands[6] & 0x20) { 70248ce62c4SMarcel Holtmann struct hci_cp_read_stored_link_key cp; 70348ce62c4SMarcel Holtmann 70448ce62c4SMarcel Holtmann bacpy(&cp.bdaddr, BDADDR_ANY); 70548ce62c4SMarcel Holtmann cp.read_all = 0x01; 70648ce62c4SMarcel Holtmann hci_req_add(req, HCI_OP_READ_STORED_LINK_KEY, sizeof(cp), &cp); 70748ce62c4SMarcel Holtmann } 70848ce62c4SMarcel Holtmann 7092177bab5SJohan Hedberg if (hdev->commands[5] & 0x10) 71042c6b129SJohan Hedberg hci_setup_link_policy(req); 7112177bab5SJohan Hedberg 712417287deSMarcel Holtmann if (hdev->commands[8] & 0x01) 713417287deSMarcel Holtmann hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL); 714417287deSMarcel Holtmann 715417287deSMarcel Holtmann /* Some older Broadcom based Bluetooth 1.2 controllers do not 716417287deSMarcel Holtmann * support the Read Page Scan Type command. Check support for 717417287deSMarcel Holtmann * this command in the bit mask of supported commands. 718417287deSMarcel Holtmann */ 719417287deSMarcel Holtmann if (hdev->commands[13] & 0x01) 720417287deSMarcel Holtmann hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL); 721417287deSMarcel Holtmann 7229193c6e8SAndre Guedes if (lmp_le_capable(hdev)) { 7239193c6e8SAndre Guedes u8 events[8]; 7249193c6e8SAndre Guedes 7259193c6e8SAndre Guedes memset(events, 0, sizeof(events)); 7264d6c705bSMarcel Holtmann events[0] = 0x0f; 7274d6c705bSMarcel Holtmann 7284d6c705bSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_ENCRYPTION) 7294d6c705bSMarcel Holtmann events[0] |= 0x10; /* LE Long Term Key Request */ 730662bc2e6SAndre Guedes 731662bc2e6SAndre Guedes /* If controller supports the Connection Parameters Request 732662bc2e6SAndre Guedes * Link Layer Procedure, enable the corresponding event. 733662bc2e6SAndre Guedes */ 734662bc2e6SAndre Guedes if (hdev->le_features[0] & HCI_LE_CONN_PARAM_REQ_PROC) 735662bc2e6SAndre Guedes events[0] |= 0x20; /* LE Remote Connection 736662bc2e6SAndre Guedes * Parameter Request 737662bc2e6SAndre Guedes */ 738662bc2e6SAndre Guedes 739a9f6068eSMarcel Holtmann /* If the controller supports the Data Length Extension 740a9f6068eSMarcel Holtmann * feature, enable the corresponding event. 741a9f6068eSMarcel Holtmann */ 742a9f6068eSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) 743a9f6068eSMarcel Holtmann events[0] |= 0x40; /* LE Data Length Change */ 744a9f6068eSMarcel Holtmann 7454b71bba4SMarcel Holtmann /* If the controller supports Extended Scanner Filter 7464b71bba4SMarcel Holtmann * Policies, enable the correspondig event. 7474b71bba4SMarcel Holtmann */ 7484b71bba4SMarcel Holtmann if (hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY) 7494b71bba4SMarcel Holtmann events[1] |= 0x04; /* LE Direct Advertising 7504b71bba4SMarcel Holtmann * Report 7514b71bba4SMarcel Holtmann */ 7524b71bba4SMarcel Holtmann 7535a34bd5fSMarcel Holtmann /* If the controller supports the LE Read Local P-256 7545a34bd5fSMarcel Holtmann * Public Key command, enable the corresponding event. 7555a34bd5fSMarcel Holtmann */ 7565a34bd5fSMarcel Holtmann if (hdev->commands[34] & 0x02) 7575a34bd5fSMarcel Holtmann events[0] |= 0x80; /* LE Read Local P-256 7585a34bd5fSMarcel Holtmann * Public Key Complete 7595a34bd5fSMarcel Holtmann */ 7605a34bd5fSMarcel Holtmann 7615a34bd5fSMarcel Holtmann /* If the controller supports the LE Generate DHKey 7625a34bd5fSMarcel Holtmann * command, enable the corresponding event. 7635a34bd5fSMarcel Holtmann */ 7645a34bd5fSMarcel Holtmann if (hdev->commands[34] & 0x04) 7655a34bd5fSMarcel Holtmann events[1] |= 0x01; /* LE Generate DHKey Complete */ 7665a34bd5fSMarcel Holtmann 7679193c6e8SAndre Guedes hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events), 7689193c6e8SAndre Guedes events); 7699193c6e8SAndre Guedes 77015a49ccaSMarcel Holtmann if (hdev->commands[25] & 0x40) { 77115a49ccaSMarcel Holtmann /* Read LE Advertising Channel TX Power */ 77215a49ccaSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL); 77315a49ccaSMarcel Holtmann } 77415a49ccaSMarcel Holtmann 775a9f6068eSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) { 776a9f6068eSMarcel Holtmann /* Read LE Maximum Data Length */ 777a9f6068eSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_MAX_DATA_LEN, 0, NULL); 778a9f6068eSMarcel Holtmann 779a9f6068eSMarcel Holtmann /* Read LE Suggested Default Data Length */ 780a9f6068eSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_DEF_DATA_LEN, 0, NULL); 781a9f6068eSMarcel Holtmann } 782a9f6068eSMarcel Holtmann 78342c6b129SJohan Hedberg hci_set_le_support(req); 7849193c6e8SAndre Guedes } 785d2c5d77fSJohan Hedberg 786d2c5d77fSJohan Hedberg /* Read features beyond page 1 if available */ 787d2c5d77fSJohan Hedberg for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) { 788d2c5d77fSJohan Hedberg struct hci_cp_read_local_ext_features cp; 789d2c5d77fSJohan Hedberg 790d2c5d77fSJohan Hedberg cp.page = p; 791d2c5d77fSJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES, 792d2c5d77fSJohan Hedberg sizeof(cp), &cp); 793d2c5d77fSJohan Hedberg } 7942177bab5SJohan Hedberg } 7952177bab5SJohan Hedberg 7965d4e7e8dSJohan Hedberg static void hci_init4_req(struct hci_request *req, unsigned long opt) 7975d4e7e8dSJohan Hedberg { 7985d4e7e8dSJohan Hedberg struct hci_dev *hdev = req->hdev; 7995d4e7e8dSJohan Hedberg 80036f260ceSMarcel Holtmann /* Some Broadcom based Bluetooth controllers do not support the 80136f260ceSMarcel Holtmann * Delete Stored Link Key command. They are clearly indicating its 80236f260ceSMarcel Holtmann * absence in the bit mask of supported commands. 80336f260ceSMarcel Holtmann * 80436f260ceSMarcel Holtmann * Check the supported commands and only if the the command is marked 80536f260ceSMarcel Holtmann * as supported send it. If not supported assume that the controller 80636f260ceSMarcel Holtmann * does not have actual support for stored link keys which makes this 80736f260ceSMarcel Holtmann * command redundant anyway. 80836f260ceSMarcel Holtmann * 80936f260ceSMarcel Holtmann * Some controllers indicate that they support handling deleting 81036f260ceSMarcel Holtmann * stored link keys, but they don't. The quirk lets a driver 81136f260ceSMarcel Holtmann * just disable this command. 81236f260ceSMarcel Holtmann */ 81336f260ceSMarcel Holtmann if (hdev->commands[6] & 0x80 && 81436f260ceSMarcel Holtmann !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) { 81536f260ceSMarcel Holtmann struct hci_cp_delete_stored_link_key cp; 81636f260ceSMarcel Holtmann 81736f260ceSMarcel Holtmann bacpy(&cp.bdaddr, BDADDR_ANY); 81836f260ceSMarcel Holtmann cp.delete_all = 0x01; 81936f260ceSMarcel Holtmann hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY, 82036f260ceSMarcel Holtmann sizeof(cp), &cp); 82136f260ceSMarcel Holtmann } 82236f260ceSMarcel Holtmann 823d62e6d67SJohan Hedberg /* Set event mask page 2 if the HCI command for it is supported */ 824d62e6d67SJohan Hedberg if (hdev->commands[22] & 0x04) 825d62e6d67SJohan Hedberg hci_set_event_mask_page_2(req); 826d62e6d67SJohan Hedberg 827109e3191SMarcel Holtmann /* Read local codec list if the HCI command is supported */ 828109e3191SMarcel Holtmann if (hdev->commands[29] & 0x20) 829109e3191SMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL); 830109e3191SMarcel Holtmann 831f4fe73edSMarcel Holtmann /* Get MWS transport configuration if the HCI command is supported */ 832f4fe73edSMarcel Holtmann if (hdev->commands[30] & 0x08) 833f4fe73edSMarcel Holtmann hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL); 834f4fe73edSMarcel Holtmann 8355d4e7e8dSJohan Hedberg /* Check for Synchronization Train support */ 83653b834d2SMarcel Holtmann if (lmp_sync_train_capable(hdev)) 8375d4e7e8dSJohan Hedberg hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL); 838a6d0d690SMarcel Holtmann 839a6d0d690SMarcel Holtmann /* Enable Secure Connections if supported and configured */ 840d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED) && 841574ea3c7SMarcel Holtmann bredr_sc_enabled(hdev)) { 842a6d0d690SMarcel Holtmann u8 support = 0x01; 843574ea3c7SMarcel Holtmann 844a6d0d690SMarcel Holtmann hci_req_add(req, HCI_OP_WRITE_SC_SUPPORT, 845a6d0d690SMarcel Holtmann sizeof(support), &support); 846a6d0d690SMarcel Holtmann } 8475d4e7e8dSJohan Hedberg } 8485d4e7e8dSJohan Hedberg 8492177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev) 8502177bab5SJohan Hedberg { 8512177bab5SJohan Hedberg int err; 8522177bab5SJohan Hedberg 8532177bab5SJohan Hedberg err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT); 8542177bab5SJohan Hedberg if (err < 0) 8552177bab5SJohan Hedberg return err; 8562177bab5SJohan Hedberg 8574b4148e9SMarcel Holtmann /* The Device Under Test (DUT) mode is special and available for 8584b4148e9SMarcel Holtmann * all controller types. So just create it early on. 8594b4148e9SMarcel Holtmann */ 860d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SETUP)) { 8614b4148e9SMarcel Holtmann debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev, 8624b4148e9SMarcel Holtmann &dut_mode_fops); 8634b4148e9SMarcel Holtmann } 8644b4148e9SMarcel Holtmann 8652177bab5SJohan Hedberg err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT); 8662177bab5SJohan Hedberg if (err < 0) 8672177bab5SJohan Hedberg return err; 8682177bab5SJohan Hedberg 8690af801b9SJohan Hedberg /* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode 8700af801b9SJohan Hedberg * BR/EDR/LE type controllers. AMP controllers only need the 8710af801b9SJohan Hedberg * first two stages of init. 8720af801b9SJohan Hedberg */ 8730af801b9SJohan Hedberg if (hdev->dev_type != HCI_BREDR) 8740af801b9SJohan Hedberg return 0; 8750af801b9SJohan Hedberg 8765d4e7e8dSJohan Hedberg err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT); 8775d4e7e8dSJohan Hedberg if (err < 0) 8785d4e7e8dSJohan Hedberg return err; 8795d4e7e8dSJohan Hedberg 880baf27f6eSMarcel Holtmann err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT); 881baf27f6eSMarcel Holtmann if (err < 0) 882baf27f6eSMarcel Holtmann return err; 883baf27f6eSMarcel Holtmann 884ec6cef9cSMarcel Holtmann /* This function is only called when the controller is actually in 885ec6cef9cSMarcel Holtmann * configured state. When the controller is marked as unconfigured, 886ec6cef9cSMarcel Holtmann * this initialization procedure is not run. 887ec6cef9cSMarcel Holtmann * 888ec6cef9cSMarcel Holtmann * It means that it is possible that a controller runs through its 889ec6cef9cSMarcel Holtmann * setup phase and then discovers missing settings. If that is the 890ec6cef9cSMarcel Holtmann * case, then this function will not be called. It then will only 891ec6cef9cSMarcel Holtmann * be called during the config phase. 892ec6cef9cSMarcel Holtmann * 893ec6cef9cSMarcel Holtmann * So only when in setup phase or config phase, create the debugfs 894ec6cef9cSMarcel Holtmann * entries and register the SMP channels. 895baf27f6eSMarcel Holtmann */ 896d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 897d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) 898baf27f6eSMarcel Holtmann return 0; 899baf27f6eSMarcel Holtmann 90060c5f5fbSMarcel Holtmann hci_debugfs_create_common(hdev); 90160c5f5fbSMarcel Holtmann 90271c3b60eSMarcel Holtmann if (lmp_bredr_capable(hdev)) 90360c5f5fbSMarcel Holtmann hci_debugfs_create_bredr(hdev); 9042bfa3531SMarcel Holtmann 905162a3bacSMarcel Holtmann if (lmp_le_capable(hdev)) 90660c5f5fbSMarcel Holtmann hci_debugfs_create_le(hdev); 907e7b8fc92SMarcel Holtmann 908baf27f6eSMarcel Holtmann return 0; 9092177bab5SJohan Hedberg } 9102177bab5SJohan Hedberg 9110ebca7d6SMarcel Holtmann static void hci_init0_req(struct hci_request *req, unsigned long opt) 9120ebca7d6SMarcel Holtmann { 9130ebca7d6SMarcel Holtmann struct hci_dev *hdev = req->hdev; 9140ebca7d6SMarcel Holtmann 9150ebca7d6SMarcel Holtmann BT_DBG("%s %ld", hdev->name, opt); 9160ebca7d6SMarcel Holtmann 9170ebca7d6SMarcel Holtmann /* Reset */ 9180ebca7d6SMarcel Holtmann if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) 9190ebca7d6SMarcel Holtmann hci_reset_req(req, 0); 9200ebca7d6SMarcel Holtmann 9210ebca7d6SMarcel Holtmann /* Read Local Version */ 9220ebca7d6SMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 9230ebca7d6SMarcel Holtmann 9240ebca7d6SMarcel Holtmann /* Read BD Address */ 9250ebca7d6SMarcel Holtmann if (hdev->set_bdaddr) 9260ebca7d6SMarcel Holtmann hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL); 9270ebca7d6SMarcel Holtmann } 9280ebca7d6SMarcel Holtmann 9290ebca7d6SMarcel Holtmann static int __hci_unconf_init(struct hci_dev *hdev) 9300ebca7d6SMarcel Holtmann { 9310ebca7d6SMarcel Holtmann int err; 9320ebca7d6SMarcel Holtmann 933cc78b44bSMarcel Holtmann if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) 934cc78b44bSMarcel Holtmann return 0; 935cc78b44bSMarcel Holtmann 9360ebca7d6SMarcel Holtmann err = __hci_req_sync(hdev, hci_init0_req, 0, HCI_INIT_TIMEOUT); 9370ebca7d6SMarcel Holtmann if (err < 0) 9380ebca7d6SMarcel Holtmann return err; 9390ebca7d6SMarcel Holtmann 9400ebca7d6SMarcel Holtmann return 0; 9410ebca7d6SMarcel Holtmann } 9420ebca7d6SMarcel Holtmann 94342c6b129SJohan Hedberg static void hci_scan_req(struct hci_request *req, unsigned long opt) 9441da177e4SLinus Torvalds { 9451da177e4SLinus Torvalds __u8 scan = opt; 9461da177e4SLinus Torvalds 94742c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, scan); 9481da177e4SLinus Torvalds 9491da177e4SLinus Torvalds /* Inquiry and Page scans */ 95042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); 9511da177e4SLinus Torvalds } 9521da177e4SLinus Torvalds 95342c6b129SJohan Hedberg static void hci_auth_req(struct hci_request *req, unsigned long opt) 9541da177e4SLinus Torvalds { 9551da177e4SLinus Torvalds __u8 auth = opt; 9561da177e4SLinus Torvalds 95742c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, auth); 9581da177e4SLinus Torvalds 9591da177e4SLinus Torvalds /* Authentication */ 96042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth); 9611da177e4SLinus Torvalds } 9621da177e4SLinus Torvalds 96342c6b129SJohan Hedberg static void hci_encrypt_req(struct hci_request *req, unsigned long opt) 9641da177e4SLinus Torvalds { 9651da177e4SLinus Torvalds __u8 encrypt = opt; 9661da177e4SLinus Torvalds 96742c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, encrypt); 9681da177e4SLinus Torvalds 969e4e8e37cSMarcel Holtmann /* Encryption */ 97042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt); 9711da177e4SLinus Torvalds } 9721da177e4SLinus Torvalds 97342c6b129SJohan Hedberg static void hci_linkpol_req(struct hci_request *req, unsigned long opt) 974e4e8e37cSMarcel Holtmann { 975e4e8e37cSMarcel Holtmann __le16 policy = cpu_to_le16(opt); 976e4e8e37cSMarcel Holtmann 97742c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, policy); 978e4e8e37cSMarcel Holtmann 979e4e8e37cSMarcel Holtmann /* Default link policy */ 98042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy); 981e4e8e37cSMarcel Holtmann } 982e4e8e37cSMarcel Holtmann 9831da177e4SLinus Torvalds /* Get HCI device by index. 9841da177e4SLinus Torvalds * Device is held on return. */ 9851da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index) 9861da177e4SLinus Torvalds { 9878035ded4SLuiz Augusto von Dentz struct hci_dev *hdev = NULL, *d; 9881da177e4SLinus Torvalds 9891da177e4SLinus Torvalds BT_DBG("%d", index); 9901da177e4SLinus Torvalds 9911da177e4SLinus Torvalds if (index < 0) 9921da177e4SLinus Torvalds return NULL; 9931da177e4SLinus Torvalds 9941da177e4SLinus Torvalds read_lock(&hci_dev_list_lock); 9958035ded4SLuiz Augusto von Dentz list_for_each_entry(d, &hci_dev_list, list) { 9961da177e4SLinus Torvalds if (d->id == index) { 9971da177e4SLinus Torvalds hdev = hci_dev_hold(d); 9981da177e4SLinus Torvalds break; 9991da177e4SLinus Torvalds } 10001da177e4SLinus Torvalds } 10011da177e4SLinus Torvalds read_unlock(&hci_dev_list_lock); 10021da177e4SLinus Torvalds return hdev; 10031da177e4SLinus Torvalds } 10041da177e4SLinus Torvalds 10051da177e4SLinus Torvalds /* ---- Inquiry support ---- */ 1006ff9ef578SJohan Hedberg 100730dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev) 100830dc78e1SJohan Hedberg { 100930dc78e1SJohan Hedberg struct discovery_state *discov = &hdev->discovery; 101030dc78e1SJohan Hedberg 10116fbe195dSAndre Guedes switch (discov->state) { 1012343f935bSAndre Guedes case DISCOVERY_FINDING: 10136fbe195dSAndre Guedes case DISCOVERY_RESOLVING: 101430dc78e1SJohan Hedberg return true; 101530dc78e1SJohan Hedberg 10166fbe195dSAndre Guedes default: 101730dc78e1SJohan Hedberg return false; 101830dc78e1SJohan Hedberg } 10196fbe195dSAndre Guedes } 102030dc78e1SJohan Hedberg 1021ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state) 1022ff9ef578SJohan Hedberg { 1023bb3e0a33SJohan Hedberg int old_state = hdev->discovery.state; 1024bb3e0a33SJohan Hedberg 1025ff9ef578SJohan Hedberg BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state); 1026ff9ef578SJohan Hedberg 1027bb3e0a33SJohan Hedberg if (old_state == state) 1028ff9ef578SJohan Hedberg return; 1029ff9ef578SJohan Hedberg 1030bb3e0a33SJohan Hedberg hdev->discovery.state = state; 1031bb3e0a33SJohan Hedberg 1032ff9ef578SJohan Hedberg switch (state) { 1033ff9ef578SJohan Hedberg case DISCOVERY_STOPPED: 1034c54c3860SAndre Guedes hci_update_background_scan(hdev); 1035c54c3860SAndre Guedes 1036bb3e0a33SJohan Hedberg if (old_state != DISCOVERY_STARTING) 1037ff9ef578SJohan Hedberg mgmt_discovering(hdev, 0); 1038ff9ef578SJohan Hedberg break; 1039ff9ef578SJohan Hedberg case DISCOVERY_STARTING: 1040ff9ef578SJohan Hedberg break; 1041343f935bSAndre Guedes case DISCOVERY_FINDING: 1042ff9ef578SJohan Hedberg mgmt_discovering(hdev, 1); 1043ff9ef578SJohan Hedberg break; 104430dc78e1SJohan Hedberg case DISCOVERY_RESOLVING: 104530dc78e1SJohan Hedberg break; 1046ff9ef578SJohan Hedberg case DISCOVERY_STOPPING: 1047ff9ef578SJohan Hedberg break; 1048ff9ef578SJohan Hedberg } 1049ff9ef578SJohan Hedberg } 1050ff9ef578SJohan Hedberg 10511f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev) 10521da177e4SLinus Torvalds { 105330883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1054b57c1a56SJohan Hedberg struct inquiry_entry *p, *n; 10551da177e4SLinus Torvalds 1056561aafbcSJohan Hedberg list_for_each_entry_safe(p, n, &cache->all, all) { 1057561aafbcSJohan Hedberg list_del(&p->all); 1058b57c1a56SJohan Hedberg kfree(p); 10591da177e4SLinus Torvalds } 1060561aafbcSJohan Hedberg 1061561aafbcSJohan Hedberg INIT_LIST_HEAD(&cache->unknown); 1062561aafbcSJohan Hedberg INIT_LIST_HEAD(&cache->resolve); 10631da177e4SLinus Torvalds } 10641da177e4SLinus Torvalds 1065a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, 1066a8c5fb1aSGustavo Padovan bdaddr_t *bdaddr) 10671da177e4SLinus Torvalds { 106830883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 10691da177e4SLinus Torvalds struct inquiry_entry *e; 10701da177e4SLinus Torvalds 10716ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, bdaddr); 10721da177e4SLinus Torvalds 1073561aafbcSJohan Hedberg list_for_each_entry(e, &cache->all, all) { 10741da177e4SLinus Torvalds if (!bacmp(&e->data.bdaddr, bdaddr)) 10751da177e4SLinus Torvalds return e; 10761da177e4SLinus Torvalds } 10771da177e4SLinus Torvalds 1078b57c1a56SJohan Hedberg return NULL; 1079b57c1a56SJohan Hedberg } 1080b57c1a56SJohan Hedberg 1081561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev, 1082561aafbcSJohan Hedberg bdaddr_t *bdaddr) 1083561aafbcSJohan Hedberg { 108430883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1085561aafbcSJohan Hedberg struct inquiry_entry *e; 1086561aafbcSJohan Hedberg 10876ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, bdaddr); 1088561aafbcSJohan Hedberg 1089561aafbcSJohan Hedberg list_for_each_entry(e, &cache->unknown, list) { 1090561aafbcSJohan Hedberg if (!bacmp(&e->data.bdaddr, bdaddr)) 1091561aafbcSJohan Hedberg return e; 1092561aafbcSJohan Hedberg } 1093561aafbcSJohan Hedberg 1094561aafbcSJohan Hedberg return NULL; 1095561aafbcSJohan Hedberg } 1096561aafbcSJohan Hedberg 109730dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev, 109830dc78e1SJohan Hedberg bdaddr_t *bdaddr, 109930dc78e1SJohan Hedberg int state) 110030dc78e1SJohan Hedberg { 110130dc78e1SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 110230dc78e1SJohan Hedberg struct inquiry_entry *e; 110330dc78e1SJohan Hedberg 11046ed93dc6SAndrei Emeltchenko BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state); 110530dc78e1SJohan Hedberg 110630dc78e1SJohan Hedberg list_for_each_entry(e, &cache->resolve, list) { 110730dc78e1SJohan Hedberg if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state) 110830dc78e1SJohan Hedberg return e; 110930dc78e1SJohan Hedberg if (!bacmp(&e->data.bdaddr, bdaddr)) 111030dc78e1SJohan Hedberg return e; 111130dc78e1SJohan Hedberg } 111230dc78e1SJohan Hedberg 111330dc78e1SJohan Hedberg return NULL; 111430dc78e1SJohan Hedberg } 111530dc78e1SJohan Hedberg 1116a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev, 1117a3d4e20aSJohan Hedberg struct inquiry_entry *ie) 1118a3d4e20aSJohan Hedberg { 1119a3d4e20aSJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1120a3d4e20aSJohan Hedberg struct list_head *pos = &cache->resolve; 1121a3d4e20aSJohan Hedberg struct inquiry_entry *p; 1122a3d4e20aSJohan Hedberg 1123a3d4e20aSJohan Hedberg list_del(&ie->list); 1124a3d4e20aSJohan Hedberg 1125a3d4e20aSJohan Hedberg list_for_each_entry(p, &cache->resolve, list) { 1126a3d4e20aSJohan Hedberg if (p->name_state != NAME_PENDING && 1127a3d4e20aSJohan Hedberg abs(p->data.rssi) >= abs(ie->data.rssi)) 1128a3d4e20aSJohan Hedberg break; 1129a3d4e20aSJohan Hedberg pos = &p->list; 1130a3d4e20aSJohan Hedberg } 1131a3d4e20aSJohan Hedberg 1132a3d4e20aSJohan Hedberg list_add(&ie->list, pos); 1133a3d4e20aSJohan Hedberg } 1134a3d4e20aSJohan Hedberg 1135af58925cSMarcel Holtmann u32 hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data, 1136af58925cSMarcel Holtmann bool name_known) 11371da177e4SLinus Torvalds { 113830883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 113970f23020SAndrei Emeltchenko struct inquiry_entry *ie; 1140af58925cSMarcel Holtmann u32 flags = 0; 11411da177e4SLinus Torvalds 11426ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, &data->bdaddr); 11431da177e4SLinus Torvalds 11446928a924SJohan Hedberg hci_remove_remote_oob_data(hdev, &data->bdaddr, BDADDR_BREDR); 11452b2fec4dSSzymon Janc 1146af58925cSMarcel Holtmann if (!data->ssp_mode) 1147af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_LEGACY_PAIRING; 1148388fc8faSJohan Hedberg 114970f23020SAndrei Emeltchenko ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr); 1150a3d4e20aSJohan Hedberg if (ie) { 1151af58925cSMarcel Holtmann if (!ie->data.ssp_mode) 1152af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_LEGACY_PAIRING; 1153388fc8faSJohan Hedberg 1154a3d4e20aSJohan Hedberg if (ie->name_state == NAME_NEEDED && 1155a3d4e20aSJohan Hedberg data->rssi != ie->data.rssi) { 1156a3d4e20aSJohan Hedberg ie->data.rssi = data->rssi; 1157a3d4e20aSJohan Hedberg hci_inquiry_cache_update_resolve(hdev, ie); 1158a3d4e20aSJohan Hedberg } 1159a3d4e20aSJohan Hedberg 1160561aafbcSJohan Hedberg goto update; 1161a3d4e20aSJohan Hedberg } 1162561aafbcSJohan Hedberg 11631da177e4SLinus Torvalds /* Entry not in the cache. Add new one. */ 116427f70f3eSJohan Hedberg ie = kzalloc(sizeof(*ie), GFP_KERNEL); 1165af58925cSMarcel Holtmann if (!ie) { 1166af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_CONFIRM_NAME; 1167af58925cSMarcel Holtmann goto done; 1168af58925cSMarcel Holtmann } 116970f23020SAndrei Emeltchenko 1170561aafbcSJohan Hedberg list_add(&ie->all, &cache->all); 1171561aafbcSJohan Hedberg 1172561aafbcSJohan Hedberg if (name_known) { 1173561aafbcSJohan Hedberg ie->name_state = NAME_KNOWN; 1174561aafbcSJohan Hedberg } else { 1175561aafbcSJohan Hedberg ie->name_state = NAME_NOT_KNOWN; 1176561aafbcSJohan Hedberg list_add(&ie->list, &cache->unknown); 1177561aafbcSJohan Hedberg } 1178561aafbcSJohan Hedberg 1179561aafbcSJohan Hedberg update: 1180561aafbcSJohan Hedberg if (name_known && ie->name_state != NAME_KNOWN && 1181561aafbcSJohan Hedberg ie->name_state != NAME_PENDING) { 1182561aafbcSJohan Hedberg ie->name_state = NAME_KNOWN; 1183561aafbcSJohan Hedberg list_del(&ie->list); 11841da177e4SLinus Torvalds } 11851da177e4SLinus Torvalds 118670f23020SAndrei Emeltchenko memcpy(&ie->data, data, sizeof(*data)); 118770f23020SAndrei Emeltchenko ie->timestamp = jiffies; 11881da177e4SLinus Torvalds cache->timestamp = jiffies; 11893175405bSJohan Hedberg 11903175405bSJohan Hedberg if (ie->name_state == NAME_NOT_KNOWN) 1191af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_CONFIRM_NAME; 11923175405bSJohan Hedberg 1193af58925cSMarcel Holtmann done: 1194af58925cSMarcel Holtmann return flags; 11951da177e4SLinus Torvalds } 11961da177e4SLinus Torvalds 11971da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf) 11981da177e4SLinus Torvalds { 119930883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 12001da177e4SLinus Torvalds struct inquiry_info *info = (struct inquiry_info *) buf; 12011da177e4SLinus Torvalds struct inquiry_entry *e; 12021da177e4SLinus Torvalds int copied = 0; 12031da177e4SLinus Torvalds 1204561aafbcSJohan Hedberg list_for_each_entry(e, &cache->all, all) { 12051da177e4SLinus Torvalds struct inquiry_data *data = &e->data; 1206b57c1a56SJohan Hedberg 1207b57c1a56SJohan Hedberg if (copied >= num) 1208b57c1a56SJohan Hedberg break; 1209b57c1a56SJohan Hedberg 12101da177e4SLinus Torvalds bacpy(&info->bdaddr, &data->bdaddr); 12111da177e4SLinus Torvalds info->pscan_rep_mode = data->pscan_rep_mode; 12121da177e4SLinus Torvalds info->pscan_period_mode = data->pscan_period_mode; 12131da177e4SLinus Torvalds info->pscan_mode = data->pscan_mode; 12141da177e4SLinus Torvalds memcpy(info->dev_class, data->dev_class, 3); 12151da177e4SLinus Torvalds info->clock_offset = data->clock_offset; 1216b57c1a56SJohan Hedberg 12171da177e4SLinus Torvalds info++; 1218b57c1a56SJohan Hedberg copied++; 12191da177e4SLinus Torvalds } 12201da177e4SLinus Torvalds 12211da177e4SLinus Torvalds BT_DBG("cache %p, copied %d", cache, copied); 12221da177e4SLinus Torvalds return copied; 12231da177e4SLinus Torvalds } 12241da177e4SLinus Torvalds 122542c6b129SJohan Hedberg static void hci_inq_req(struct hci_request *req, unsigned long opt) 12261da177e4SLinus Torvalds { 12271da177e4SLinus Torvalds struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt; 122842c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 12291da177e4SLinus Torvalds struct hci_cp_inquiry cp; 12301da177e4SLinus Torvalds 12311da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 12321da177e4SLinus Torvalds 12331da177e4SLinus Torvalds if (test_bit(HCI_INQUIRY, &hdev->flags)) 12341da177e4SLinus Torvalds return; 12351da177e4SLinus Torvalds 12361da177e4SLinus Torvalds /* Start Inquiry */ 12371da177e4SLinus Torvalds memcpy(&cp.lap, &ir->lap, 3); 12381da177e4SLinus Torvalds cp.length = ir->length; 12391da177e4SLinus Torvalds cp.num_rsp = ir->num_rsp; 124042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp); 12411da177e4SLinus Torvalds } 12421da177e4SLinus Torvalds 12431da177e4SLinus Torvalds int hci_inquiry(void __user *arg) 12441da177e4SLinus Torvalds { 12451da177e4SLinus Torvalds __u8 __user *ptr = arg; 12461da177e4SLinus Torvalds struct hci_inquiry_req ir; 12471da177e4SLinus Torvalds struct hci_dev *hdev; 12481da177e4SLinus Torvalds int err = 0, do_inquiry = 0, max_rsp; 12491da177e4SLinus Torvalds long timeo; 12501da177e4SLinus Torvalds __u8 *buf; 12511da177e4SLinus Torvalds 12521da177e4SLinus Torvalds if (copy_from_user(&ir, ptr, sizeof(ir))) 12531da177e4SLinus Torvalds return -EFAULT; 12541da177e4SLinus Torvalds 12555a08ecceSAndrei Emeltchenko hdev = hci_dev_get(ir.dev_id); 12565a08ecceSAndrei Emeltchenko if (!hdev) 12571da177e4SLinus Torvalds return -ENODEV; 12581da177e4SLinus Torvalds 1259d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 12600736cfa8SMarcel Holtmann err = -EBUSY; 12610736cfa8SMarcel Holtmann goto done; 12620736cfa8SMarcel Holtmann } 12630736cfa8SMarcel Holtmann 1264d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1265fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1266fee746b0SMarcel Holtmann goto done; 1267fee746b0SMarcel Holtmann } 1268fee746b0SMarcel Holtmann 12695b69bef5SMarcel Holtmann if (hdev->dev_type != HCI_BREDR) { 12705b69bef5SMarcel Holtmann err = -EOPNOTSUPP; 12715b69bef5SMarcel Holtmann goto done; 12725b69bef5SMarcel Holtmann } 12735b69bef5SMarcel Holtmann 1274d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { 127556f87901SJohan Hedberg err = -EOPNOTSUPP; 127656f87901SJohan Hedberg goto done; 127756f87901SJohan Hedberg } 127856f87901SJohan Hedberg 127909fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 12801da177e4SLinus Torvalds if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX || 1281a8c5fb1aSGustavo Padovan inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) { 12821f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 12831da177e4SLinus Torvalds do_inquiry = 1; 12841da177e4SLinus Torvalds } 128509fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 12861da177e4SLinus Torvalds 128704837f64SMarcel Holtmann timeo = ir.length * msecs_to_jiffies(2000); 128870f23020SAndrei Emeltchenko 128970f23020SAndrei Emeltchenko if (do_inquiry) { 129001178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir, 129101178cd4SJohan Hedberg timeo); 129270f23020SAndrei Emeltchenko if (err < 0) 12931da177e4SLinus Torvalds goto done; 12943e13fa1eSAndre Guedes 12953e13fa1eSAndre Guedes /* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is 12963e13fa1eSAndre Guedes * cleared). If it is interrupted by a signal, return -EINTR. 12973e13fa1eSAndre Guedes */ 129874316201SNeilBrown if (wait_on_bit(&hdev->flags, HCI_INQUIRY, 12993e13fa1eSAndre Guedes TASK_INTERRUPTIBLE)) 13003e13fa1eSAndre Guedes return -EINTR; 130170f23020SAndrei Emeltchenko } 13021da177e4SLinus Torvalds 13038fc9ced3SGustavo Padovan /* for unlimited number of responses we will use buffer with 13048fc9ced3SGustavo Padovan * 255 entries 13058fc9ced3SGustavo Padovan */ 13061da177e4SLinus Torvalds max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp; 13071da177e4SLinus Torvalds 13081da177e4SLinus Torvalds /* cache_dump can't sleep. Therefore we allocate temp buffer and then 13091da177e4SLinus Torvalds * copy it to the user space. 13101da177e4SLinus Torvalds */ 131170f23020SAndrei Emeltchenko buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL); 131270f23020SAndrei Emeltchenko if (!buf) { 13131da177e4SLinus Torvalds err = -ENOMEM; 13141da177e4SLinus Torvalds goto done; 13151da177e4SLinus Torvalds } 13161da177e4SLinus Torvalds 131709fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 13181da177e4SLinus Torvalds ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf); 131909fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 13201da177e4SLinus Torvalds 13211da177e4SLinus Torvalds BT_DBG("num_rsp %d", ir.num_rsp); 13221da177e4SLinus Torvalds 13231da177e4SLinus Torvalds if (!copy_to_user(ptr, &ir, sizeof(ir))) { 13241da177e4SLinus Torvalds ptr += sizeof(ir); 13251da177e4SLinus Torvalds if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) * 13261da177e4SLinus Torvalds ir.num_rsp)) 13271da177e4SLinus Torvalds err = -EFAULT; 13281da177e4SLinus Torvalds } else 13291da177e4SLinus Torvalds err = -EFAULT; 13301da177e4SLinus Torvalds 13311da177e4SLinus Torvalds kfree(buf); 13321da177e4SLinus Torvalds 13331da177e4SLinus Torvalds done: 13341da177e4SLinus Torvalds hci_dev_put(hdev); 13351da177e4SLinus Torvalds return err; 13361da177e4SLinus Torvalds } 13371da177e4SLinus Torvalds 1338cbed0ca1SJohan Hedberg static int hci_dev_do_open(struct hci_dev *hdev) 13391da177e4SLinus Torvalds { 13401da177e4SLinus Torvalds int ret = 0; 13411da177e4SLinus Torvalds 13421da177e4SLinus Torvalds BT_DBG("%s %p", hdev->name, hdev); 13431da177e4SLinus Torvalds 13441da177e4SLinus Torvalds hci_req_lock(hdev); 13451da177e4SLinus Torvalds 1346d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) { 134794324962SJohan Hovold ret = -ENODEV; 134894324962SJohan Hovold goto done; 134994324962SJohan Hovold } 135094324962SJohan Hovold 1351d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 1352d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) { 1353a5c8f270SMarcel Holtmann /* Check for rfkill but allow the HCI setup stage to 1354a5c8f270SMarcel Holtmann * proceed (which in itself doesn't cause any RF activity). 1355bf543036SJohan Hedberg */ 1356d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_RFKILLED)) { 1357611b30f7SMarcel Holtmann ret = -ERFKILL; 1358611b30f7SMarcel Holtmann goto done; 1359611b30f7SMarcel Holtmann } 1360611b30f7SMarcel Holtmann 1361a5c8f270SMarcel Holtmann /* Check for valid public address or a configured static 1362a5c8f270SMarcel Holtmann * random adddress, but let the HCI setup proceed to 1363a5c8f270SMarcel Holtmann * be able to determine if there is a public address 1364a5c8f270SMarcel Holtmann * or not. 1365a5c8f270SMarcel Holtmann * 1366c6beca0eSMarcel Holtmann * In case of user channel usage, it is not important 1367c6beca0eSMarcel Holtmann * if a public address or static random address is 1368c6beca0eSMarcel Holtmann * available. 1369c6beca0eSMarcel Holtmann * 1370a5c8f270SMarcel Holtmann * This check is only valid for BR/EDR controllers 1371a5c8f270SMarcel Holtmann * since AMP controllers do not have an address. 1372a5c8f270SMarcel Holtmann */ 1373d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 1374c6beca0eSMarcel Holtmann hdev->dev_type == HCI_BREDR && 1375a5c8f270SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) && 1376a5c8f270SMarcel Holtmann !bacmp(&hdev->static_addr, BDADDR_ANY)) { 1377a5c8f270SMarcel Holtmann ret = -EADDRNOTAVAIL; 1378a5c8f270SMarcel Holtmann goto done; 1379a5c8f270SMarcel Holtmann } 1380a5c8f270SMarcel Holtmann } 1381a5c8f270SMarcel Holtmann 13821da177e4SLinus Torvalds if (test_bit(HCI_UP, &hdev->flags)) { 13831da177e4SLinus Torvalds ret = -EALREADY; 13841da177e4SLinus Torvalds goto done; 13851da177e4SLinus Torvalds } 13861da177e4SLinus Torvalds 13871da177e4SLinus Torvalds if (hdev->open(hdev)) { 13881da177e4SLinus Torvalds ret = -EIO; 13891da177e4SLinus Torvalds goto done; 13901da177e4SLinus Torvalds } 13911da177e4SLinus Torvalds 13921da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 13931da177e4SLinus Torvalds set_bit(HCI_INIT, &hdev->flags); 1394f41c70c4SMarcel Holtmann 1395d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SETUP)) { 1396af202f84SMarcel Holtmann if (hdev->setup) 1397f41c70c4SMarcel Holtmann ret = hdev->setup(hdev); 1398f41c70c4SMarcel Holtmann 1399af202f84SMarcel Holtmann /* The transport driver can set these quirks before 1400af202f84SMarcel Holtmann * creating the HCI device or in its setup callback. 1401af202f84SMarcel Holtmann * 1402af202f84SMarcel Holtmann * In case any of them is set, the controller has to 1403af202f84SMarcel Holtmann * start up as unconfigured. 1404af202f84SMarcel Holtmann */ 1405eb1904f4SMarcel Holtmann if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || 1406eb1904f4SMarcel Holtmann test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks)) 1407a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNCONFIGURED); 1408f41c70c4SMarcel Holtmann 14090ebca7d6SMarcel Holtmann /* For an unconfigured controller it is required to 14100ebca7d6SMarcel Holtmann * read at least the version information provided by 14110ebca7d6SMarcel Holtmann * the Read Local Version Information command. 14120ebca7d6SMarcel Holtmann * 14130ebca7d6SMarcel Holtmann * If the set_bdaddr driver callback is provided, then 14140ebca7d6SMarcel Holtmann * also the original Bluetooth public device address 14150ebca7d6SMarcel Holtmann * will be read using the Read BD Address command. 14160ebca7d6SMarcel Holtmann */ 1417d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 14180ebca7d6SMarcel Holtmann ret = __hci_unconf_init(hdev); 141989bc22d2SMarcel Holtmann } 142089bc22d2SMarcel Holtmann 1421d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_CONFIG)) { 14229713c17bSMarcel Holtmann /* If public address change is configured, ensure that 14239713c17bSMarcel Holtmann * the address gets programmed. If the driver does not 14249713c17bSMarcel Holtmann * support changing the public address, fail the power 14259713c17bSMarcel Holtmann * on procedure. 142624c457e2SMarcel Holtmann */ 14279713c17bSMarcel Holtmann if (bacmp(&hdev->public_addr, BDADDR_ANY) && 14289713c17bSMarcel Holtmann hdev->set_bdaddr) 142924c457e2SMarcel Holtmann ret = hdev->set_bdaddr(hdev, &hdev->public_addr); 143024c457e2SMarcel Holtmann else 143124c457e2SMarcel Holtmann ret = -EADDRNOTAVAIL; 143224c457e2SMarcel Holtmann } 143324c457e2SMarcel Holtmann 1434f41c70c4SMarcel Holtmann if (!ret) { 1435d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1436d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) 14372177bab5SJohan Hedberg ret = __hci_init(hdev); 14381da177e4SLinus Torvalds } 14391da177e4SLinus Torvalds 1440f41c70c4SMarcel Holtmann clear_bit(HCI_INIT, &hdev->flags); 1441f41c70c4SMarcel Holtmann 14421da177e4SLinus Torvalds if (!ret) { 14431da177e4SLinus Torvalds hci_dev_hold(hdev); 1444a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); 14451da177e4SLinus Torvalds set_bit(HCI_UP, &hdev->flags); 14461da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_UP); 1447d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 1448d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG) && 1449d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1450d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 14511514b892SMarcel Holtmann hdev->dev_type == HCI_BREDR) { 145209fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 1453744cf19eSJohan Hedberg mgmt_powered(hdev, 1); 145409fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 145556e5cb86SJohan Hedberg } 14561da177e4SLinus Torvalds } else { 14571da177e4SLinus Torvalds /* Init failed, cleanup */ 14583eff45eaSGustavo F. Padovan flush_work(&hdev->tx_work); 1459c347b765SGustavo F. Padovan flush_work(&hdev->cmd_work); 1460b78752ccSMarcel Holtmann flush_work(&hdev->rx_work); 14611da177e4SLinus Torvalds 14621da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 14631da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 14641da177e4SLinus Torvalds 14651da177e4SLinus Torvalds if (hdev->flush) 14661da177e4SLinus Torvalds hdev->flush(hdev); 14671da177e4SLinus Torvalds 14681da177e4SLinus Torvalds if (hdev->sent_cmd) { 14691da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 14701da177e4SLinus Torvalds hdev->sent_cmd = NULL; 14711da177e4SLinus Torvalds } 14721da177e4SLinus Torvalds 14731da177e4SLinus Torvalds hdev->close(hdev); 1474fee746b0SMarcel Holtmann hdev->flags &= BIT(HCI_RAW); 14751da177e4SLinus Torvalds } 14761da177e4SLinus Torvalds 14771da177e4SLinus Torvalds done: 14781da177e4SLinus Torvalds hci_req_unlock(hdev); 14791da177e4SLinus Torvalds return ret; 14801da177e4SLinus Torvalds } 14811da177e4SLinus Torvalds 1482cbed0ca1SJohan Hedberg /* ---- HCI ioctl helpers ---- */ 1483cbed0ca1SJohan Hedberg 1484cbed0ca1SJohan Hedberg int hci_dev_open(__u16 dev) 1485cbed0ca1SJohan Hedberg { 1486cbed0ca1SJohan Hedberg struct hci_dev *hdev; 1487cbed0ca1SJohan Hedberg int err; 1488cbed0ca1SJohan Hedberg 1489cbed0ca1SJohan Hedberg hdev = hci_dev_get(dev); 1490cbed0ca1SJohan Hedberg if (!hdev) 1491cbed0ca1SJohan Hedberg return -ENODEV; 1492cbed0ca1SJohan Hedberg 14934a964404SMarcel Holtmann /* Devices that are marked as unconfigured can only be powered 1494fee746b0SMarcel Holtmann * up as user channel. Trying to bring them up as normal devices 1495fee746b0SMarcel Holtmann * will result into a failure. Only user channel operation is 1496fee746b0SMarcel Holtmann * possible. 1497fee746b0SMarcel Holtmann * 1498fee746b0SMarcel Holtmann * When this function is called for a user channel, the flag 1499fee746b0SMarcel Holtmann * HCI_USER_CHANNEL will be set first before attempting to 1500fee746b0SMarcel Holtmann * open the device. 1501fee746b0SMarcel Holtmann */ 1502d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1503d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 1504fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1505fee746b0SMarcel Holtmann goto done; 1506fee746b0SMarcel Holtmann } 1507fee746b0SMarcel Holtmann 1508e1d08f40SJohan Hedberg /* We need to ensure that no other power on/off work is pending 1509e1d08f40SJohan Hedberg * before proceeding to call hci_dev_do_open. This is 1510e1d08f40SJohan Hedberg * particularly important if the setup procedure has not yet 1511e1d08f40SJohan Hedberg * completed. 1512e1d08f40SJohan Hedberg */ 1513a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) 1514e1d08f40SJohan Hedberg cancel_delayed_work(&hdev->power_off); 1515e1d08f40SJohan Hedberg 1516a5c8f270SMarcel Holtmann /* After this call it is guaranteed that the setup procedure 1517a5c8f270SMarcel Holtmann * has finished. This means that error conditions like RFKILL 1518a5c8f270SMarcel Holtmann * or no valid public or static random address apply. 1519a5c8f270SMarcel Holtmann */ 1520e1d08f40SJohan Hedberg flush_workqueue(hdev->req_workqueue); 1521e1d08f40SJohan Hedberg 152212aa4f0aSMarcel Holtmann /* For controllers not using the management interface and that 1523b6ae8457SJohan Hedberg * are brought up using legacy ioctl, set the HCI_BONDABLE bit 152412aa4f0aSMarcel Holtmann * so that pairing works for them. Once the management interface 152512aa4f0aSMarcel Holtmann * is in use this bit will be cleared again and userspace has 152612aa4f0aSMarcel Holtmann * to explicitly enable it. 152712aa4f0aSMarcel Holtmann */ 1528d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 1529d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_MGMT)) 1530a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BONDABLE); 153112aa4f0aSMarcel Holtmann 1532cbed0ca1SJohan Hedberg err = hci_dev_do_open(hdev); 1533cbed0ca1SJohan Hedberg 1534fee746b0SMarcel Holtmann done: 1535cbed0ca1SJohan Hedberg hci_dev_put(hdev); 1536cbed0ca1SJohan Hedberg return err; 1537cbed0ca1SJohan Hedberg } 1538cbed0ca1SJohan Hedberg 1539d7347f3cSJohan Hedberg /* This function requires the caller holds hdev->lock */ 1540d7347f3cSJohan Hedberg static void hci_pend_le_actions_clear(struct hci_dev *hdev) 1541d7347f3cSJohan Hedberg { 1542d7347f3cSJohan Hedberg struct hci_conn_params *p; 1543d7347f3cSJohan Hedberg 1544f161dd41SJohan Hedberg list_for_each_entry(p, &hdev->le_conn_params, list) { 1545f161dd41SJohan Hedberg if (p->conn) { 1546f161dd41SJohan Hedberg hci_conn_drop(p->conn); 1547f8aaf9b6SJohan Hedberg hci_conn_put(p->conn); 1548f161dd41SJohan Hedberg p->conn = NULL; 1549f161dd41SJohan Hedberg } 1550d7347f3cSJohan Hedberg list_del_init(&p->action); 1551f161dd41SJohan Hedberg } 1552d7347f3cSJohan Hedberg 1553d7347f3cSJohan Hedberg BT_DBG("All LE pending actions cleared"); 1554d7347f3cSJohan Hedberg } 1555d7347f3cSJohan Hedberg 15561da177e4SLinus Torvalds static int hci_dev_do_close(struct hci_dev *hdev) 15571da177e4SLinus Torvalds { 15581da177e4SLinus Torvalds BT_DBG("%s %p", hdev->name, hdev); 15591da177e4SLinus Torvalds 1560d24d8144SGabriele Mazzotta if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) && 1561d24d8144SGabriele Mazzotta test_bit(HCI_UP, &hdev->flags)) { 1562a44fecbdSTedd Ho-Jeong An /* Execute vendor specific shutdown routine */ 1563a44fecbdSTedd Ho-Jeong An if (hdev->shutdown) 1564a44fecbdSTedd Ho-Jeong An hdev->shutdown(hdev); 1565a44fecbdSTedd Ho-Jeong An } 1566a44fecbdSTedd Ho-Jeong An 156778c04c0bSVinicius Costa Gomes cancel_delayed_work(&hdev->power_off); 156878c04c0bSVinicius Costa Gomes 15691da177e4SLinus Torvalds hci_req_cancel(hdev, ENODEV); 15701da177e4SLinus Torvalds hci_req_lock(hdev); 15711da177e4SLinus Torvalds 15721da177e4SLinus Torvalds if (!test_and_clear_bit(HCI_UP, &hdev->flags)) { 157365cc2b49SMarcel Holtmann cancel_delayed_work_sync(&hdev->cmd_timer); 15741da177e4SLinus Torvalds hci_req_unlock(hdev); 15751da177e4SLinus Torvalds return 0; 15761da177e4SLinus Torvalds } 15771da177e4SLinus Torvalds 15783eff45eaSGustavo F. Padovan /* Flush RX and TX works */ 15793eff45eaSGustavo F. Padovan flush_work(&hdev->tx_work); 1580b78752ccSMarcel Holtmann flush_work(&hdev->rx_work); 15811da177e4SLinus Torvalds 158216ab91abSJohan Hedberg if (hdev->discov_timeout > 0) { 1583e0f9309fSJohan Hedberg cancel_delayed_work(&hdev->discov_off); 158416ab91abSJohan Hedberg hdev->discov_timeout = 0; 1585a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); 1586a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); 158716ab91abSJohan Hedberg } 158816ab91abSJohan Hedberg 1589a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) 15907d78525dSJohan Hedberg cancel_delayed_work(&hdev->service_cache); 15917d78525dSJohan Hedberg 15927ba8b4beSAndre Guedes cancel_delayed_work_sync(&hdev->le_scan_disable); 15932d28cfe7SJakub Pawlowski cancel_delayed_work_sync(&hdev->le_scan_restart); 15944518bb0fSJohan Hedberg 1595d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_MGMT)) 1596d6bfd59cSJohan Hedberg cancel_delayed_work_sync(&hdev->rpa_expired); 15977ba8b4beSAndre Guedes 159876727c02SJohan Hedberg /* Avoid potential lockdep warnings from the *_flush() calls by 159976727c02SJohan Hedberg * ensuring the workqueue is empty up front. 160076727c02SJohan Hedberg */ 160176727c02SJohan Hedberg drain_workqueue(hdev->workqueue); 160276727c02SJohan Hedberg 160309fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 16041aeb9c65SJohan Hedberg 16058f502f84SJohan Hedberg hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 16068f502f84SJohan Hedberg 1607a69d8927SMarcel Holtmann if (!hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) { 16081aeb9c65SJohan Hedberg if (hdev->dev_type == HCI_BREDR) 16091aeb9c65SJohan Hedberg mgmt_powered(hdev, 0); 16101aeb9c65SJohan Hedberg } 16111aeb9c65SJohan Hedberg 16121f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 1613d7347f3cSJohan Hedberg hci_pend_le_actions_clear(hdev); 1614f161dd41SJohan Hedberg hci_conn_hash_flush(hdev); 161509fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 16161da177e4SLinus Torvalds 161764dae967SMarcel Holtmann smp_unregister(hdev); 161864dae967SMarcel Holtmann 16191da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_DOWN); 16201da177e4SLinus Torvalds 16211da177e4SLinus Torvalds if (hdev->flush) 16221da177e4SLinus Torvalds hdev->flush(hdev); 16231da177e4SLinus Torvalds 16241da177e4SLinus Torvalds /* Reset device */ 16251da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 16261da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 1627d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_AUTO_OFF) && 1628d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1629a6c511c6SSzymon Janc test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) { 16301da177e4SLinus Torvalds set_bit(HCI_INIT, &hdev->flags); 163101178cd4SJohan Hedberg __hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT); 16321da177e4SLinus Torvalds clear_bit(HCI_INIT, &hdev->flags); 16331da177e4SLinus Torvalds } 16341da177e4SLinus Torvalds 1635c347b765SGustavo F. Padovan /* flush cmd work */ 1636c347b765SGustavo F. Padovan flush_work(&hdev->cmd_work); 16371da177e4SLinus Torvalds 16381da177e4SLinus Torvalds /* Drop queues */ 16391da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 16401da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 16411da177e4SLinus Torvalds skb_queue_purge(&hdev->raw_q); 16421da177e4SLinus Torvalds 16431da177e4SLinus Torvalds /* Drop last sent command */ 16441da177e4SLinus Torvalds if (hdev->sent_cmd) { 164565cc2b49SMarcel Holtmann cancel_delayed_work_sync(&hdev->cmd_timer); 16461da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 16471da177e4SLinus Torvalds hdev->sent_cmd = NULL; 16481da177e4SLinus Torvalds } 16491da177e4SLinus Torvalds 16501da177e4SLinus Torvalds /* After this point our queues are empty 16511da177e4SLinus Torvalds * and no tasks are scheduled. */ 16521da177e4SLinus Torvalds hdev->close(hdev); 16531da177e4SLinus Torvalds 165435b973c9SJohan Hedberg /* Clear flags */ 1655fee746b0SMarcel Holtmann hdev->flags &= BIT(HCI_RAW); 1656eacb44dfSMarcel Holtmann hci_dev_clear_volatile_flags(hdev); 165735b973c9SJohan Hedberg 1658ced5c338SAndrei Emeltchenko /* Controller radio is available but is currently powered down */ 1659536619e8SMarcel Holtmann hdev->amp_status = AMP_STATUS_POWERED_DOWN; 1660ced5c338SAndrei Emeltchenko 1661e59fda8dSJohan Hedberg memset(hdev->eir, 0, sizeof(hdev->eir)); 166209b3c3fbSJohan Hedberg memset(hdev->dev_class, 0, sizeof(hdev->dev_class)); 16637a4cd51dSMarcel Holtmann bacpy(&hdev->random_addr, BDADDR_ANY); 1664e59fda8dSJohan Hedberg 16651da177e4SLinus Torvalds hci_req_unlock(hdev); 16661da177e4SLinus Torvalds 16671da177e4SLinus Torvalds hci_dev_put(hdev); 16681da177e4SLinus Torvalds return 0; 16691da177e4SLinus Torvalds } 16701da177e4SLinus Torvalds 16711da177e4SLinus Torvalds int hci_dev_close(__u16 dev) 16721da177e4SLinus Torvalds { 16731da177e4SLinus Torvalds struct hci_dev *hdev; 16741da177e4SLinus Torvalds int err; 16751da177e4SLinus Torvalds 167670f23020SAndrei Emeltchenko hdev = hci_dev_get(dev); 167770f23020SAndrei Emeltchenko if (!hdev) 16781da177e4SLinus Torvalds return -ENODEV; 16798ee56540SMarcel Holtmann 1680d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 16810736cfa8SMarcel Holtmann err = -EBUSY; 16820736cfa8SMarcel Holtmann goto done; 16830736cfa8SMarcel Holtmann } 16840736cfa8SMarcel Holtmann 1685a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) 16868ee56540SMarcel Holtmann cancel_delayed_work(&hdev->power_off); 16878ee56540SMarcel Holtmann 16881da177e4SLinus Torvalds err = hci_dev_do_close(hdev); 16898ee56540SMarcel Holtmann 16900736cfa8SMarcel Holtmann done: 16911da177e4SLinus Torvalds hci_dev_put(hdev); 16921da177e4SLinus Torvalds return err; 16931da177e4SLinus Torvalds } 16941da177e4SLinus Torvalds 16955c912495SMarcel Holtmann static int hci_dev_do_reset(struct hci_dev *hdev) 16961da177e4SLinus Torvalds { 16975c912495SMarcel Holtmann int ret; 16981da177e4SLinus Torvalds 16995c912495SMarcel Holtmann BT_DBG("%s %p", hdev->name, hdev); 17001da177e4SLinus Torvalds 17011da177e4SLinus Torvalds hci_req_lock(hdev); 17021da177e4SLinus Torvalds 17031da177e4SLinus Torvalds /* Drop queues */ 17041da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 17051da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 17061da177e4SLinus Torvalds 170776727c02SJohan Hedberg /* Avoid potential lockdep warnings from the *_flush() calls by 170876727c02SJohan Hedberg * ensuring the workqueue is empty up front. 170976727c02SJohan Hedberg */ 171076727c02SJohan Hedberg drain_workqueue(hdev->workqueue); 171176727c02SJohan Hedberg 171209fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 17131f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 17141da177e4SLinus Torvalds hci_conn_hash_flush(hdev); 171509fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 17161da177e4SLinus Torvalds 17171da177e4SLinus Torvalds if (hdev->flush) 17181da177e4SLinus Torvalds hdev->flush(hdev); 17191da177e4SLinus Torvalds 17201da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 17216ed58ec5SVille Tervo hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0; 17221da177e4SLinus Torvalds 172301178cd4SJohan Hedberg ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT); 17241da177e4SLinus Torvalds 17251da177e4SLinus Torvalds hci_req_unlock(hdev); 17261da177e4SLinus Torvalds return ret; 17271da177e4SLinus Torvalds } 17281da177e4SLinus Torvalds 17295c912495SMarcel Holtmann int hci_dev_reset(__u16 dev) 17305c912495SMarcel Holtmann { 17315c912495SMarcel Holtmann struct hci_dev *hdev; 17325c912495SMarcel Holtmann int err; 17335c912495SMarcel Holtmann 17345c912495SMarcel Holtmann hdev = hci_dev_get(dev); 17355c912495SMarcel Holtmann if (!hdev) 17365c912495SMarcel Holtmann return -ENODEV; 17375c912495SMarcel Holtmann 17385c912495SMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) { 17395c912495SMarcel Holtmann err = -ENETDOWN; 17405c912495SMarcel Holtmann goto done; 17415c912495SMarcel Holtmann } 17425c912495SMarcel Holtmann 1743d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 17445c912495SMarcel Holtmann err = -EBUSY; 17455c912495SMarcel Holtmann goto done; 17465c912495SMarcel Holtmann } 17475c912495SMarcel Holtmann 1748d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 17495c912495SMarcel Holtmann err = -EOPNOTSUPP; 17505c912495SMarcel Holtmann goto done; 17515c912495SMarcel Holtmann } 17525c912495SMarcel Holtmann 17535c912495SMarcel Holtmann err = hci_dev_do_reset(hdev); 17545c912495SMarcel Holtmann 17555c912495SMarcel Holtmann done: 17565c912495SMarcel Holtmann hci_dev_put(hdev); 17575c912495SMarcel Holtmann return err; 17585c912495SMarcel Holtmann } 17595c912495SMarcel Holtmann 17601da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev) 17611da177e4SLinus Torvalds { 17621da177e4SLinus Torvalds struct hci_dev *hdev; 17631da177e4SLinus Torvalds int ret = 0; 17641da177e4SLinus Torvalds 176570f23020SAndrei Emeltchenko hdev = hci_dev_get(dev); 176670f23020SAndrei Emeltchenko if (!hdev) 17671da177e4SLinus Torvalds return -ENODEV; 17681da177e4SLinus Torvalds 1769d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 17700736cfa8SMarcel Holtmann ret = -EBUSY; 17710736cfa8SMarcel Holtmann goto done; 17720736cfa8SMarcel Holtmann } 17730736cfa8SMarcel Holtmann 1774d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1775fee746b0SMarcel Holtmann ret = -EOPNOTSUPP; 1776fee746b0SMarcel Holtmann goto done; 1777fee746b0SMarcel Holtmann } 1778fee746b0SMarcel Holtmann 17791da177e4SLinus Torvalds memset(&hdev->stat, 0, sizeof(struct hci_dev_stats)); 17801da177e4SLinus Torvalds 17810736cfa8SMarcel Holtmann done: 17821da177e4SLinus Torvalds hci_dev_put(hdev); 17831da177e4SLinus Torvalds return ret; 17841da177e4SLinus Torvalds } 17851da177e4SLinus Torvalds 1786123abc08SJohan Hedberg static void hci_update_scan_state(struct hci_dev *hdev, u8 scan) 1787123abc08SJohan Hedberg { 1788bc6d2d04SJohan Hedberg bool conn_changed, discov_changed; 1789123abc08SJohan Hedberg 1790123abc08SJohan Hedberg BT_DBG("%s scan 0x%02x", hdev->name, scan); 1791123abc08SJohan Hedberg 1792123abc08SJohan Hedberg if ((scan & SCAN_PAGE)) 1793238be788SMarcel Holtmann conn_changed = !hci_dev_test_and_set_flag(hdev, 1794238be788SMarcel Holtmann HCI_CONNECTABLE); 1795123abc08SJohan Hedberg else 1796a69d8927SMarcel Holtmann conn_changed = hci_dev_test_and_clear_flag(hdev, 1797a69d8927SMarcel Holtmann HCI_CONNECTABLE); 1798123abc08SJohan Hedberg 1799bc6d2d04SJohan Hedberg if ((scan & SCAN_INQUIRY)) { 1800238be788SMarcel Holtmann discov_changed = !hci_dev_test_and_set_flag(hdev, 1801238be788SMarcel Holtmann HCI_DISCOVERABLE); 1802bc6d2d04SJohan Hedberg } else { 1803a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); 1804a69d8927SMarcel Holtmann discov_changed = hci_dev_test_and_clear_flag(hdev, 1805a69d8927SMarcel Holtmann HCI_DISCOVERABLE); 1806bc6d2d04SJohan Hedberg } 1807bc6d2d04SJohan Hedberg 1808d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_MGMT)) 1809123abc08SJohan Hedberg return; 1810123abc08SJohan Hedberg 1811bc6d2d04SJohan Hedberg if (conn_changed || discov_changed) { 1812bc6d2d04SJohan Hedberg /* In case this was disabled through mgmt */ 1813a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); 1814bc6d2d04SJohan Hedberg 1815d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) 1816bc6d2d04SJohan Hedberg mgmt_update_adv_data(hdev); 1817bc6d2d04SJohan Hedberg 1818123abc08SJohan Hedberg mgmt_new_settings(hdev); 1819123abc08SJohan Hedberg } 1820bc6d2d04SJohan Hedberg } 1821123abc08SJohan Hedberg 18221da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg) 18231da177e4SLinus Torvalds { 18241da177e4SLinus Torvalds struct hci_dev *hdev; 18251da177e4SLinus Torvalds struct hci_dev_req dr; 18261da177e4SLinus Torvalds int err = 0; 18271da177e4SLinus Torvalds 18281da177e4SLinus Torvalds if (copy_from_user(&dr, arg, sizeof(dr))) 18291da177e4SLinus Torvalds return -EFAULT; 18301da177e4SLinus Torvalds 183170f23020SAndrei Emeltchenko hdev = hci_dev_get(dr.dev_id); 183270f23020SAndrei Emeltchenko if (!hdev) 18331da177e4SLinus Torvalds return -ENODEV; 18341da177e4SLinus Torvalds 1835d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 18360736cfa8SMarcel Holtmann err = -EBUSY; 18370736cfa8SMarcel Holtmann goto done; 18380736cfa8SMarcel Holtmann } 18390736cfa8SMarcel Holtmann 1840d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1841fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1842fee746b0SMarcel Holtmann goto done; 1843fee746b0SMarcel Holtmann } 1844fee746b0SMarcel Holtmann 18455b69bef5SMarcel Holtmann if (hdev->dev_type != HCI_BREDR) { 18465b69bef5SMarcel Holtmann err = -EOPNOTSUPP; 18475b69bef5SMarcel Holtmann goto done; 18485b69bef5SMarcel Holtmann } 18495b69bef5SMarcel Holtmann 1850d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { 185156f87901SJohan Hedberg err = -EOPNOTSUPP; 185256f87901SJohan Hedberg goto done; 185356f87901SJohan Hedberg } 185456f87901SJohan Hedberg 18551da177e4SLinus Torvalds switch (cmd) { 18561da177e4SLinus Torvalds case HCISETAUTH: 185701178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt, 18585f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 18591da177e4SLinus Torvalds break; 18601da177e4SLinus Torvalds 18611da177e4SLinus Torvalds case HCISETENCRYPT: 18621da177e4SLinus Torvalds if (!lmp_encrypt_capable(hdev)) { 18631da177e4SLinus Torvalds err = -EOPNOTSUPP; 18641da177e4SLinus Torvalds break; 18651da177e4SLinus Torvalds } 18661da177e4SLinus Torvalds 18671da177e4SLinus Torvalds if (!test_bit(HCI_AUTH, &hdev->flags)) { 18681da177e4SLinus Torvalds /* Auth must be enabled first */ 186901178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt, 18705f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 18711da177e4SLinus Torvalds if (err) 18721da177e4SLinus Torvalds break; 18731da177e4SLinus Torvalds } 18741da177e4SLinus Torvalds 187501178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt, 18765f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 18771da177e4SLinus Torvalds break; 18781da177e4SLinus Torvalds 18791da177e4SLinus Torvalds case HCISETSCAN: 188001178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt, 18815f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 188291a668b0SJohan Hedberg 1883bc6d2d04SJohan Hedberg /* Ensure that the connectable and discoverable states 1884bc6d2d04SJohan Hedberg * get correctly modified as this was a non-mgmt change. 188591a668b0SJohan Hedberg */ 1886123abc08SJohan Hedberg if (!err) 1887123abc08SJohan Hedberg hci_update_scan_state(hdev, dr.dev_opt); 18881da177e4SLinus Torvalds break; 18891da177e4SLinus Torvalds 18901da177e4SLinus Torvalds case HCISETLINKPOL: 189101178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt, 18925f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 18931da177e4SLinus Torvalds break; 18941da177e4SLinus Torvalds 18951da177e4SLinus Torvalds case HCISETLINKMODE: 1896e4e8e37cSMarcel Holtmann hdev->link_mode = ((__u16) dr.dev_opt) & 1897e4e8e37cSMarcel Holtmann (HCI_LM_MASTER | HCI_LM_ACCEPT); 1898e4e8e37cSMarcel Holtmann break; 1899e4e8e37cSMarcel Holtmann 1900e4e8e37cSMarcel Holtmann case HCISETPTYPE: 1901e4e8e37cSMarcel Holtmann hdev->pkt_type = (__u16) dr.dev_opt; 19021da177e4SLinus Torvalds break; 19031da177e4SLinus Torvalds 19041da177e4SLinus Torvalds case HCISETACLMTU: 19051da177e4SLinus Torvalds hdev->acl_mtu = *((__u16 *) &dr.dev_opt + 1); 19061da177e4SLinus Torvalds hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0); 19071da177e4SLinus Torvalds break; 19081da177e4SLinus Torvalds 19091da177e4SLinus Torvalds case HCISETSCOMTU: 19101da177e4SLinus Torvalds hdev->sco_mtu = *((__u16 *) &dr.dev_opt + 1); 19111da177e4SLinus Torvalds hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0); 19121da177e4SLinus Torvalds break; 19131da177e4SLinus Torvalds 19141da177e4SLinus Torvalds default: 19151da177e4SLinus Torvalds err = -EINVAL; 19161da177e4SLinus Torvalds break; 19171da177e4SLinus Torvalds } 1918e4e8e37cSMarcel Holtmann 19190736cfa8SMarcel Holtmann done: 19201da177e4SLinus Torvalds hci_dev_put(hdev); 19211da177e4SLinus Torvalds return err; 19221da177e4SLinus Torvalds } 19231da177e4SLinus Torvalds 19241da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg) 19251da177e4SLinus Torvalds { 19268035ded4SLuiz Augusto von Dentz struct hci_dev *hdev; 19271da177e4SLinus Torvalds struct hci_dev_list_req *dl; 19281da177e4SLinus Torvalds struct hci_dev_req *dr; 19291da177e4SLinus Torvalds int n = 0, size, err; 19301da177e4SLinus Torvalds __u16 dev_num; 19311da177e4SLinus Torvalds 19321da177e4SLinus Torvalds if (get_user(dev_num, (__u16 __user *) arg)) 19331da177e4SLinus Torvalds return -EFAULT; 19341da177e4SLinus Torvalds 19351da177e4SLinus Torvalds if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr)) 19361da177e4SLinus Torvalds return -EINVAL; 19371da177e4SLinus Torvalds 19381da177e4SLinus Torvalds size = sizeof(*dl) + dev_num * sizeof(*dr); 19391da177e4SLinus Torvalds 194070f23020SAndrei Emeltchenko dl = kzalloc(size, GFP_KERNEL); 194170f23020SAndrei Emeltchenko if (!dl) 19421da177e4SLinus Torvalds return -ENOMEM; 19431da177e4SLinus Torvalds 19441da177e4SLinus Torvalds dr = dl->dev_req; 19451da177e4SLinus Torvalds 1946f20d09d5SGustavo F. Padovan read_lock(&hci_dev_list_lock); 19478035ded4SLuiz Augusto von Dentz list_for_each_entry(hdev, &hci_dev_list, list) { 19482e84d8dbSMarcel Holtmann unsigned long flags = hdev->flags; 1949c542a06cSJohan Hedberg 19502e84d8dbSMarcel Holtmann /* When the auto-off is configured it means the transport 19512e84d8dbSMarcel Holtmann * is running, but in that case still indicate that the 19522e84d8dbSMarcel Holtmann * device is actually down. 19532e84d8dbSMarcel Holtmann */ 1954d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) 19552e84d8dbSMarcel Holtmann flags &= ~BIT(HCI_UP); 1956c542a06cSJohan Hedberg 19571da177e4SLinus Torvalds (dr + n)->dev_id = hdev->id; 19582e84d8dbSMarcel Holtmann (dr + n)->dev_opt = flags; 1959c542a06cSJohan Hedberg 19601da177e4SLinus Torvalds if (++n >= dev_num) 19611da177e4SLinus Torvalds break; 19621da177e4SLinus Torvalds } 1963f20d09d5SGustavo F. Padovan read_unlock(&hci_dev_list_lock); 19641da177e4SLinus Torvalds 19651da177e4SLinus Torvalds dl->dev_num = n; 19661da177e4SLinus Torvalds size = sizeof(*dl) + n * sizeof(*dr); 19671da177e4SLinus Torvalds 19681da177e4SLinus Torvalds err = copy_to_user(arg, dl, size); 19691da177e4SLinus Torvalds kfree(dl); 19701da177e4SLinus Torvalds 19711da177e4SLinus Torvalds return err ? -EFAULT : 0; 19721da177e4SLinus Torvalds } 19731da177e4SLinus Torvalds 19741da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg) 19751da177e4SLinus Torvalds { 19761da177e4SLinus Torvalds struct hci_dev *hdev; 19771da177e4SLinus Torvalds struct hci_dev_info di; 19782e84d8dbSMarcel Holtmann unsigned long flags; 19791da177e4SLinus Torvalds int err = 0; 19801da177e4SLinus Torvalds 19811da177e4SLinus Torvalds if (copy_from_user(&di, arg, sizeof(di))) 19821da177e4SLinus Torvalds return -EFAULT; 19831da177e4SLinus Torvalds 198470f23020SAndrei Emeltchenko hdev = hci_dev_get(di.dev_id); 198570f23020SAndrei Emeltchenko if (!hdev) 19861da177e4SLinus Torvalds return -ENODEV; 19871da177e4SLinus Torvalds 19882e84d8dbSMarcel Holtmann /* When the auto-off is configured it means the transport 19892e84d8dbSMarcel Holtmann * is running, but in that case still indicate that the 19902e84d8dbSMarcel Holtmann * device is actually down. 19912e84d8dbSMarcel Holtmann */ 1992d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) 19932e84d8dbSMarcel Holtmann flags = hdev->flags & ~BIT(HCI_UP); 19942e84d8dbSMarcel Holtmann else 19952e84d8dbSMarcel Holtmann flags = hdev->flags; 1996c542a06cSJohan Hedberg 19971da177e4SLinus Torvalds strcpy(di.name, hdev->name); 19981da177e4SLinus Torvalds di.bdaddr = hdev->bdaddr; 199960f2a3edSMarcel Holtmann di.type = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4); 20002e84d8dbSMarcel Holtmann di.flags = flags; 20011da177e4SLinus Torvalds di.pkt_type = hdev->pkt_type; 2002572c7f84SJohan Hedberg if (lmp_bredr_capable(hdev)) { 20031da177e4SLinus Torvalds di.acl_mtu = hdev->acl_mtu; 20041da177e4SLinus Torvalds di.acl_pkts = hdev->acl_pkts; 20051da177e4SLinus Torvalds di.sco_mtu = hdev->sco_mtu; 20061da177e4SLinus Torvalds di.sco_pkts = hdev->sco_pkts; 2007572c7f84SJohan Hedberg } else { 2008572c7f84SJohan Hedberg di.acl_mtu = hdev->le_mtu; 2009572c7f84SJohan Hedberg di.acl_pkts = hdev->le_pkts; 2010572c7f84SJohan Hedberg di.sco_mtu = 0; 2011572c7f84SJohan Hedberg di.sco_pkts = 0; 2012572c7f84SJohan Hedberg } 20131da177e4SLinus Torvalds di.link_policy = hdev->link_policy; 20141da177e4SLinus Torvalds di.link_mode = hdev->link_mode; 20151da177e4SLinus Torvalds 20161da177e4SLinus Torvalds memcpy(&di.stat, &hdev->stat, sizeof(di.stat)); 20171da177e4SLinus Torvalds memcpy(&di.features, &hdev->features, sizeof(di.features)); 20181da177e4SLinus Torvalds 20191da177e4SLinus Torvalds if (copy_to_user(arg, &di, sizeof(di))) 20201da177e4SLinus Torvalds err = -EFAULT; 20211da177e4SLinus Torvalds 20221da177e4SLinus Torvalds hci_dev_put(hdev); 20231da177e4SLinus Torvalds 20241da177e4SLinus Torvalds return err; 20251da177e4SLinus Torvalds } 20261da177e4SLinus Torvalds 20271da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */ 20281da177e4SLinus Torvalds 2029611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked) 2030611b30f7SMarcel Holtmann { 2031611b30f7SMarcel Holtmann struct hci_dev *hdev = data; 2032611b30f7SMarcel Holtmann 2033611b30f7SMarcel Holtmann BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked); 2034611b30f7SMarcel Holtmann 2035d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) 20360736cfa8SMarcel Holtmann return -EBUSY; 20370736cfa8SMarcel Holtmann 20385e130367SJohan Hedberg if (blocked) { 2039a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RFKILLED); 2040d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 2041d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) 2042611b30f7SMarcel Holtmann hci_dev_do_close(hdev); 20435e130367SJohan Hedberg } else { 2044a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_RFKILLED); 20455e130367SJohan Hedberg } 2046611b30f7SMarcel Holtmann 2047611b30f7SMarcel Holtmann return 0; 2048611b30f7SMarcel Holtmann } 2049611b30f7SMarcel Holtmann 2050611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = { 2051611b30f7SMarcel Holtmann .set_block = hci_rfkill_set_block, 2052611b30f7SMarcel Holtmann }; 2053611b30f7SMarcel Holtmann 2054ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work) 2055ab81cbf9SJohan Hedberg { 2056ab81cbf9SJohan Hedberg struct hci_dev *hdev = container_of(work, struct hci_dev, power_on); 205796570ffcSJohan Hedberg int err; 2058ab81cbf9SJohan Hedberg 2059ab81cbf9SJohan Hedberg BT_DBG("%s", hdev->name); 2060ab81cbf9SJohan Hedberg 2061cbed0ca1SJohan Hedberg err = hci_dev_do_open(hdev); 206296570ffcSJohan Hedberg if (err < 0) { 20633ad67582SJaganath Kanakkassery hci_dev_lock(hdev); 206496570ffcSJohan Hedberg mgmt_set_powered_failed(hdev, err); 20653ad67582SJaganath Kanakkassery hci_dev_unlock(hdev); 2066ab81cbf9SJohan Hedberg return; 206796570ffcSJohan Hedberg } 2068ab81cbf9SJohan Hedberg 2069a5c8f270SMarcel Holtmann /* During the HCI setup phase, a few error conditions are 2070a5c8f270SMarcel Holtmann * ignored and they need to be checked now. If they are still 2071a5c8f270SMarcel Holtmann * valid, it is important to turn the device back off. 2072a5c8f270SMarcel Holtmann */ 2073d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_RFKILLED) || 2074d7a5a11dSMarcel Holtmann hci_dev_test_flag(hdev, HCI_UNCONFIGURED) || 2075a5c8f270SMarcel Holtmann (hdev->dev_type == HCI_BREDR && 2076a5c8f270SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) && 2077a5c8f270SMarcel Holtmann !bacmp(&hdev->static_addr, BDADDR_ANY))) { 2078a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_AUTO_OFF); 2079bf543036SJohan Hedberg hci_dev_do_close(hdev); 2080d7a5a11dSMarcel Holtmann } else if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) { 208119202573SJohan Hedberg queue_delayed_work(hdev->req_workqueue, &hdev->power_off, 208219202573SJohan Hedberg HCI_AUTO_OFF_TIMEOUT); 2083bf543036SJohan Hedberg } 2084ab81cbf9SJohan Hedberg 2085a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_SETUP)) { 20864a964404SMarcel Holtmann /* For unconfigured devices, set the HCI_RAW flag 20874a964404SMarcel Holtmann * so that userspace can easily identify them. 20884a964404SMarcel Holtmann */ 2089d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 20904a964404SMarcel Holtmann set_bit(HCI_RAW, &hdev->flags); 20910602a8adSMarcel Holtmann 20920602a8adSMarcel Holtmann /* For fully configured devices, this will send 20930602a8adSMarcel Holtmann * the Index Added event. For unconfigured devices, 20940602a8adSMarcel Holtmann * it will send Unconfigued Index Added event. 20950602a8adSMarcel Holtmann * 20960602a8adSMarcel Holtmann * Devices with HCI_QUIRK_RAW_DEVICE are ignored 20970602a8adSMarcel Holtmann * and no event will be send. 20980602a8adSMarcel Holtmann */ 2099744cf19eSJohan Hedberg mgmt_index_added(hdev); 2100a69d8927SMarcel Holtmann } else if (hci_dev_test_and_clear_flag(hdev, HCI_CONFIG)) { 21015ea234d3SMarcel Holtmann /* When the controller is now configured, then it 21025ea234d3SMarcel Holtmann * is important to clear the HCI_RAW flag. 21035ea234d3SMarcel Holtmann */ 2104d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 21055ea234d3SMarcel Holtmann clear_bit(HCI_RAW, &hdev->flags); 21065ea234d3SMarcel Holtmann 2107d603b76bSMarcel Holtmann /* Powering on the controller with HCI_CONFIG set only 2108d603b76bSMarcel Holtmann * happens with the transition from unconfigured to 2109d603b76bSMarcel Holtmann * configured. This will send the Index Added event. 2110d603b76bSMarcel Holtmann */ 2111d603b76bSMarcel Holtmann mgmt_index_added(hdev); 2112ab81cbf9SJohan Hedberg } 2113ab81cbf9SJohan Hedberg } 2114ab81cbf9SJohan Hedberg 2115ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work) 2116ab81cbf9SJohan Hedberg { 21173243553fSJohan Hedberg struct hci_dev *hdev = container_of(work, struct hci_dev, 21183243553fSJohan Hedberg power_off.work); 2119ab81cbf9SJohan Hedberg 2120ab81cbf9SJohan Hedberg BT_DBG("%s", hdev->name); 2121ab81cbf9SJohan Hedberg 21228ee56540SMarcel Holtmann hci_dev_do_close(hdev); 2123ab81cbf9SJohan Hedberg } 2124ab81cbf9SJohan Hedberg 2125c7741d16SMarcel Holtmann static void hci_error_reset(struct work_struct *work) 2126c7741d16SMarcel Holtmann { 2127c7741d16SMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, error_reset); 2128c7741d16SMarcel Holtmann 2129c7741d16SMarcel Holtmann BT_DBG("%s", hdev->name); 2130c7741d16SMarcel Holtmann 2131c7741d16SMarcel Holtmann if (hdev->hw_error) 2132c7741d16SMarcel Holtmann hdev->hw_error(hdev, hdev->hw_error_code); 2133c7741d16SMarcel Holtmann else 2134c7741d16SMarcel Holtmann BT_ERR("%s hardware error 0x%2.2x", hdev->name, 2135c7741d16SMarcel Holtmann hdev->hw_error_code); 2136c7741d16SMarcel Holtmann 2137c7741d16SMarcel Holtmann if (hci_dev_do_close(hdev)) 2138c7741d16SMarcel Holtmann return; 2139c7741d16SMarcel Holtmann 2140c7741d16SMarcel Holtmann hci_dev_do_open(hdev); 2141c7741d16SMarcel Holtmann } 2142c7741d16SMarcel Holtmann 214316ab91abSJohan Hedberg static void hci_discov_off(struct work_struct *work) 214416ab91abSJohan Hedberg { 214516ab91abSJohan Hedberg struct hci_dev *hdev; 214616ab91abSJohan Hedberg 214716ab91abSJohan Hedberg hdev = container_of(work, struct hci_dev, discov_off.work); 214816ab91abSJohan Hedberg 214916ab91abSJohan Hedberg BT_DBG("%s", hdev->name); 215016ab91abSJohan Hedberg 2151d1967ff8SMarcel Holtmann mgmt_discoverable_timeout(hdev); 215216ab91abSJohan Hedberg } 215316ab91abSJohan Hedberg 215435f7498aSJohan Hedberg void hci_uuids_clear(struct hci_dev *hdev) 21552aeb9a1aSJohan Hedberg { 21564821002cSJohan Hedberg struct bt_uuid *uuid, *tmp; 21572aeb9a1aSJohan Hedberg 21584821002cSJohan Hedberg list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) { 21594821002cSJohan Hedberg list_del(&uuid->list); 21602aeb9a1aSJohan Hedberg kfree(uuid); 21612aeb9a1aSJohan Hedberg } 21622aeb9a1aSJohan Hedberg } 21632aeb9a1aSJohan Hedberg 216435f7498aSJohan Hedberg void hci_link_keys_clear(struct hci_dev *hdev) 216555ed8ca1SJohan Hedberg { 216655ed8ca1SJohan Hedberg struct link_key *key; 216755ed8ca1SJohan Hedberg 21680378b597SJohan Hedberg list_for_each_entry_rcu(key, &hdev->link_keys, list) { 21690378b597SJohan Hedberg list_del_rcu(&key->list); 21700378b597SJohan Hedberg kfree_rcu(key, rcu); 217155ed8ca1SJohan Hedberg } 217255ed8ca1SJohan Hedberg } 217355ed8ca1SJohan Hedberg 217435f7498aSJohan Hedberg void hci_smp_ltks_clear(struct hci_dev *hdev) 2175b899efafSVinicius Costa Gomes { 2176970d0f1bSJohan Hedberg struct smp_ltk *k; 2177b899efafSVinicius Costa Gomes 2178970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 2179970d0f1bSJohan Hedberg list_del_rcu(&k->list); 2180970d0f1bSJohan Hedberg kfree_rcu(k, rcu); 2181b899efafSVinicius Costa Gomes } 2182b899efafSVinicius Costa Gomes } 2183b899efafSVinicius Costa Gomes 2184970c4e46SJohan Hedberg void hci_smp_irks_clear(struct hci_dev *hdev) 2185970c4e46SJohan Hedberg { 2186adae20cbSJohan Hedberg struct smp_irk *k; 2187970c4e46SJohan Hedberg 2188adae20cbSJohan Hedberg list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) { 2189adae20cbSJohan Hedberg list_del_rcu(&k->list); 2190adae20cbSJohan Hedberg kfree_rcu(k, rcu); 2191970c4e46SJohan Hedberg } 2192970c4e46SJohan Hedberg } 2193970c4e46SJohan Hedberg 219455ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) 219555ed8ca1SJohan Hedberg { 219655ed8ca1SJohan Hedberg struct link_key *k; 219755ed8ca1SJohan Hedberg 21980378b597SJohan Hedberg rcu_read_lock(); 21990378b597SJohan Hedberg list_for_each_entry_rcu(k, &hdev->link_keys, list) { 22000378b597SJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) == 0) { 22010378b597SJohan Hedberg rcu_read_unlock(); 220255ed8ca1SJohan Hedberg return k; 22030378b597SJohan Hedberg } 22040378b597SJohan Hedberg } 22050378b597SJohan Hedberg rcu_read_unlock(); 220655ed8ca1SJohan Hedberg 220755ed8ca1SJohan Hedberg return NULL; 220855ed8ca1SJohan Hedberg } 220955ed8ca1SJohan Hedberg 2210745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn, 2211d25e28abSJohan Hedberg u8 key_type, u8 old_key_type) 2212d25e28abSJohan Hedberg { 2213d25e28abSJohan Hedberg /* Legacy key */ 2214d25e28abSJohan Hedberg if (key_type < 0x03) 2215745c0ce3SVishal Agarwal return true; 2216d25e28abSJohan Hedberg 2217d25e28abSJohan Hedberg /* Debug keys are insecure so don't store them persistently */ 2218d25e28abSJohan Hedberg if (key_type == HCI_LK_DEBUG_COMBINATION) 2219745c0ce3SVishal Agarwal return false; 2220d25e28abSJohan Hedberg 2221d25e28abSJohan Hedberg /* Changed combination key and there's no previous one */ 2222d25e28abSJohan Hedberg if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff) 2223745c0ce3SVishal Agarwal return false; 2224d25e28abSJohan Hedberg 2225d25e28abSJohan Hedberg /* Security mode 3 case */ 2226d25e28abSJohan Hedberg if (!conn) 2227745c0ce3SVishal Agarwal return true; 2228d25e28abSJohan Hedberg 2229e3befab9SJohan Hedberg /* BR/EDR key derived using SC from an LE link */ 2230e3befab9SJohan Hedberg if (conn->type == LE_LINK) 2231e3befab9SJohan Hedberg return true; 2232e3befab9SJohan Hedberg 2233d25e28abSJohan Hedberg /* Neither local nor remote side had no-bonding as requirement */ 2234d25e28abSJohan Hedberg if (conn->auth_type > 0x01 && conn->remote_auth > 0x01) 2235745c0ce3SVishal Agarwal return true; 2236d25e28abSJohan Hedberg 2237d25e28abSJohan Hedberg /* Local side had dedicated bonding as requirement */ 2238d25e28abSJohan Hedberg if (conn->auth_type == 0x02 || conn->auth_type == 0x03) 2239745c0ce3SVishal Agarwal return true; 2240d25e28abSJohan Hedberg 2241d25e28abSJohan Hedberg /* Remote side had dedicated bonding as requirement */ 2242d25e28abSJohan Hedberg if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03) 2243745c0ce3SVishal Agarwal return true; 2244d25e28abSJohan Hedberg 2245d25e28abSJohan Hedberg /* If none of the above criteria match, then don't store the key 2246d25e28abSJohan Hedberg * persistently */ 2247745c0ce3SVishal Agarwal return false; 2248d25e28abSJohan Hedberg } 2249d25e28abSJohan Hedberg 2250e804d25dSJohan Hedberg static u8 ltk_role(u8 type) 225198a0b845SJohan Hedberg { 2252e804d25dSJohan Hedberg if (type == SMP_LTK) 2253e804d25dSJohan Hedberg return HCI_ROLE_MASTER; 225498a0b845SJohan Hedberg 2255e804d25dSJohan Hedberg return HCI_ROLE_SLAVE; 225698a0b845SJohan Hedberg } 225798a0b845SJohan Hedberg 2258f3a73d97SJohan Hedberg struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, 2259e804d25dSJohan Hedberg u8 addr_type, u8 role) 226075d262c2SVinicius Costa Gomes { 2261c9839a11SVinicius Costa Gomes struct smp_ltk *k; 226275d262c2SVinicius Costa Gomes 2263970d0f1bSJohan Hedberg rcu_read_lock(); 2264970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 22655378bc56SJohan Hedberg if (addr_type != k->bdaddr_type || bacmp(bdaddr, &k->bdaddr)) 22665378bc56SJohan Hedberg continue; 22675378bc56SJohan Hedberg 2268923e2414SJohan Hedberg if (smp_ltk_is_sc(k) || ltk_role(k->type) == role) { 2269970d0f1bSJohan Hedberg rcu_read_unlock(); 227075d262c2SVinicius Costa Gomes return k; 2271970d0f1bSJohan Hedberg } 2272970d0f1bSJohan Hedberg } 2273970d0f1bSJohan Hedberg rcu_read_unlock(); 227475d262c2SVinicius Costa Gomes 227575d262c2SVinicius Costa Gomes return NULL; 227675d262c2SVinicius Costa Gomes } 227775d262c2SVinicius Costa Gomes 2278970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa) 2279970c4e46SJohan Hedberg { 2280970c4e46SJohan Hedberg struct smp_irk *irk; 2281970c4e46SJohan Hedberg 2282adae20cbSJohan Hedberg rcu_read_lock(); 2283adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2284adae20cbSJohan Hedberg if (!bacmp(&irk->rpa, rpa)) { 2285adae20cbSJohan Hedberg rcu_read_unlock(); 2286970c4e46SJohan Hedberg return irk; 2287970c4e46SJohan Hedberg } 2288adae20cbSJohan Hedberg } 2289970c4e46SJohan Hedberg 2290adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2291defce9e8SJohan Hedberg if (smp_irk_matches(hdev, irk->val, rpa)) { 2292970c4e46SJohan Hedberg bacpy(&irk->rpa, rpa); 2293adae20cbSJohan Hedberg rcu_read_unlock(); 2294970c4e46SJohan Hedberg return irk; 2295970c4e46SJohan Hedberg } 2296970c4e46SJohan Hedberg } 2297adae20cbSJohan Hedberg rcu_read_unlock(); 2298970c4e46SJohan Hedberg 2299970c4e46SJohan Hedberg return NULL; 2300970c4e46SJohan Hedberg } 2301970c4e46SJohan Hedberg 2302970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr, 2303970c4e46SJohan Hedberg u8 addr_type) 2304970c4e46SJohan Hedberg { 2305970c4e46SJohan Hedberg struct smp_irk *irk; 2306970c4e46SJohan Hedberg 23076cfc9988SJohan Hedberg /* Identity Address must be public or static random */ 23086cfc9988SJohan Hedberg if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0) 23096cfc9988SJohan Hedberg return NULL; 23106cfc9988SJohan Hedberg 2311adae20cbSJohan Hedberg rcu_read_lock(); 2312adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2313970c4e46SJohan Hedberg if (addr_type == irk->addr_type && 2314adae20cbSJohan Hedberg bacmp(bdaddr, &irk->bdaddr) == 0) { 2315adae20cbSJohan Hedberg rcu_read_unlock(); 2316970c4e46SJohan Hedberg return irk; 2317970c4e46SJohan Hedberg } 2318adae20cbSJohan Hedberg } 2319adae20cbSJohan Hedberg rcu_read_unlock(); 2320970c4e46SJohan Hedberg 2321970c4e46SJohan Hedberg return NULL; 2322970c4e46SJohan Hedberg } 2323970c4e46SJohan Hedberg 2324567fa2aaSJohan Hedberg struct link_key *hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, 23257652ff6aSJohan Hedberg bdaddr_t *bdaddr, u8 *val, u8 type, 23267652ff6aSJohan Hedberg u8 pin_len, bool *persistent) 232755ed8ca1SJohan Hedberg { 232855ed8ca1SJohan Hedberg struct link_key *key, *old_key; 2329745c0ce3SVishal Agarwal u8 old_key_type; 233055ed8ca1SJohan Hedberg 233155ed8ca1SJohan Hedberg old_key = hci_find_link_key(hdev, bdaddr); 233255ed8ca1SJohan Hedberg if (old_key) { 233355ed8ca1SJohan Hedberg old_key_type = old_key->type; 233455ed8ca1SJohan Hedberg key = old_key; 233555ed8ca1SJohan Hedberg } else { 233612adcf3aSJohan Hedberg old_key_type = conn ? conn->key_type : 0xff; 23370a14ab41SJohan Hedberg key = kzalloc(sizeof(*key), GFP_KERNEL); 233855ed8ca1SJohan Hedberg if (!key) 2339567fa2aaSJohan Hedberg return NULL; 23400378b597SJohan Hedberg list_add_rcu(&key->list, &hdev->link_keys); 234155ed8ca1SJohan Hedberg } 234255ed8ca1SJohan Hedberg 23436ed93dc6SAndrei Emeltchenko BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type); 234455ed8ca1SJohan Hedberg 2345d25e28abSJohan Hedberg /* Some buggy controller combinations generate a changed 2346d25e28abSJohan Hedberg * combination key for legacy pairing even when there's no 2347d25e28abSJohan Hedberg * previous key */ 2348d25e28abSJohan Hedberg if (type == HCI_LK_CHANGED_COMBINATION && 2349a8c5fb1aSGustavo Padovan (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) { 2350d25e28abSJohan Hedberg type = HCI_LK_COMBINATION; 2351655fe6ecSJohan Hedberg if (conn) 2352655fe6ecSJohan Hedberg conn->key_type = type; 2353655fe6ecSJohan Hedberg } 2354d25e28abSJohan Hedberg 235555ed8ca1SJohan Hedberg bacpy(&key->bdaddr, bdaddr); 23569b3b4460SAndrei Emeltchenko memcpy(key->val, val, HCI_LINK_KEY_SIZE); 235755ed8ca1SJohan Hedberg key->pin_len = pin_len; 235855ed8ca1SJohan Hedberg 2359b6020ba0SWaldemar Rymarkiewicz if (type == HCI_LK_CHANGED_COMBINATION) 236055ed8ca1SJohan Hedberg key->type = old_key_type; 23614748fed2SJohan Hedberg else 23624748fed2SJohan Hedberg key->type = type; 23634748fed2SJohan Hedberg 23647652ff6aSJohan Hedberg if (persistent) 23657652ff6aSJohan Hedberg *persistent = hci_persistent_key(hdev, conn, type, 23667652ff6aSJohan Hedberg old_key_type); 23674df378a1SJohan Hedberg 2368567fa2aaSJohan Hedberg return key; 236955ed8ca1SJohan Hedberg } 237055ed8ca1SJohan Hedberg 2371ca9142b8SJohan Hedberg struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, 237235d70271SJohan Hedberg u8 addr_type, u8 type, u8 authenticated, 2373fe39c7b2SMarcel Holtmann u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand) 237475d262c2SVinicius Costa Gomes { 2375c9839a11SVinicius Costa Gomes struct smp_ltk *key, *old_key; 2376e804d25dSJohan Hedberg u8 role = ltk_role(type); 237775d262c2SVinicius Costa Gomes 2378f3a73d97SJohan Hedberg old_key = hci_find_ltk(hdev, bdaddr, addr_type, role); 2379c9839a11SVinicius Costa Gomes if (old_key) 238075d262c2SVinicius Costa Gomes key = old_key; 2381c9839a11SVinicius Costa Gomes else { 23820a14ab41SJohan Hedberg key = kzalloc(sizeof(*key), GFP_KERNEL); 238375d262c2SVinicius Costa Gomes if (!key) 2384ca9142b8SJohan Hedberg return NULL; 2385970d0f1bSJohan Hedberg list_add_rcu(&key->list, &hdev->long_term_keys); 238675d262c2SVinicius Costa Gomes } 238775d262c2SVinicius Costa Gomes 238875d262c2SVinicius Costa Gomes bacpy(&key->bdaddr, bdaddr); 2389c9839a11SVinicius Costa Gomes key->bdaddr_type = addr_type; 2390c9839a11SVinicius Costa Gomes memcpy(key->val, tk, sizeof(key->val)); 2391c9839a11SVinicius Costa Gomes key->authenticated = authenticated; 2392c9839a11SVinicius Costa Gomes key->ediv = ediv; 2393fe39c7b2SMarcel Holtmann key->rand = rand; 2394c9839a11SVinicius Costa Gomes key->enc_size = enc_size; 2395c9839a11SVinicius Costa Gomes key->type = type; 239675d262c2SVinicius Costa Gomes 2397ca9142b8SJohan Hedberg return key; 239875d262c2SVinicius Costa Gomes } 239975d262c2SVinicius Costa Gomes 2400ca9142b8SJohan Hedberg struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, 2401ca9142b8SJohan Hedberg u8 addr_type, u8 val[16], bdaddr_t *rpa) 2402970c4e46SJohan Hedberg { 2403970c4e46SJohan Hedberg struct smp_irk *irk; 2404970c4e46SJohan Hedberg 2405970c4e46SJohan Hedberg irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type); 2406970c4e46SJohan Hedberg if (!irk) { 2407970c4e46SJohan Hedberg irk = kzalloc(sizeof(*irk), GFP_KERNEL); 2408970c4e46SJohan Hedberg if (!irk) 2409ca9142b8SJohan Hedberg return NULL; 2410970c4e46SJohan Hedberg 2411970c4e46SJohan Hedberg bacpy(&irk->bdaddr, bdaddr); 2412970c4e46SJohan Hedberg irk->addr_type = addr_type; 2413970c4e46SJohan Hedberg 2414adae20cbSJohan Hedberg list_add_rcu(&irk->list, &hdev->identity_resolving_keys); 2415970c4e46SJohan Hedberg } 2416970c4e46SJohan Hedberg 2417970c4e46SJohan Hedberg memcpy(irk->val, val, 16); 2418970c4e46SJohan Hedberg bacpy(&irk->rpa, rpa); 2419970c4e46SJohan Hedberg 2420ca9142b8SJohan Hedberg return irk; 2421970c4e46SJohan Hedberg } 2422970c4e46SJohan Hedberg 242355ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) 242455ed8ca1SJohan Hedberg { 242555ed8ca1SJohan Hedberg struct link_key *key; 242655ed8ca1SJohan Hedberg 242755ed8ca1SJohan Hedberg key = hci_find_link_key(hdev, bdaddr); 242855ed8ca1SJohan Hedberg if (!key) 242955ed8ca1SJohan Hedberg return -ENOENT; 243055ed8ca1SJohan Hedberg 24316ed93dc6SAndrei Emeltchenko BT_DBG("%s removing %pMR", hdev->name, bdaddr); 243255ed8ca1SJohan Hedberg 24330378b597SJohan Hedberg list_del_rcu(&key->list); 24340378b597SJohan Hedberg kfree_rcu(key, rcu); 243555ed8ca1SJohan Hedberg 243655ed8ca1SJohan Hedberg return 0; 243755ed8ca1SJohan Hedberg } 243855ed8ca1SJohan Hedberg 2439e0b2b27eSJohan Hedberg int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type) 2440b899efafSVinicius Costa Gomes { 2441970d0f1bSJohan Hedberg struct smp_ltk *k; 2442c51ffa0bSJohan Hedberg int removed = 0; 2443b899efafSVinicius Costa Gomes 2444970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 2445e0b2b27eSJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type) 2446b899efafSVinicius Costa Gomes continue; 2447b899efafSVinicius Costa Gomes 24486ed93dc6SAndrei Emeltchenko BT_DBG("%s removing %pMR", hdev->name, bdaddr); 2449b899efafSVinicius Costa Gomes 2450970d0f1bSJohan Hedberg list_del_rcu(&k->list); 2451970d0f1bSJohan Hedberg kfree_rcu(k, rcu); 2452c51ffa0bSJohan Hedberg removed++; 2453b899efafSVinicius Costa Gomes } 2454b899efafSVinicius Costa Gomes 2455c51ffa0bSJohan Hedberg return removed ? 0 : -ENOENT; 2456b899efafSVinicius Costa Gomes } 2457b899efafSVinicius Costa Gomes 2458a7ec7338SJohan Hedberg void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type) 2459a7ec7338SJohan Hedberg { 2460adae20cbSJohan Hedberg struct smp_irk *k; 2461a7ec7338SJohan Hedberg 2462adae20cbSJohan Hedberg list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) { 2463a7ec7338SJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type) 2464a7ec7338SJohan Hedberg continue; 2465a7ec7338SJohan Hedberg 2466a7ec7338SJohan Hedberg BT_DBG("%s removing %pMR", hdev->name, bdaddr); 2467a7ec7338SJohan Hedberg 2468adae20cbSJohan Hedberg list_del_rcu(&k->list); 2469adae20cbSJohan Hedberg kfree_rcu(k, rcu); 2470a7ec7338SJohan Hedberg } 2471a7ec7338SJohan Hedberg } 2472a7ec7338SJohan Hedberg 247355e76b38SJohan Hedberg bool hci_bdaddr_is_paired(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) 247455e76b38SJohan Hedberg { 247555e76b38SJohan Hedberg struct smp_ltk *k; 24764ba9faf3SJohan Hedberg struct smp_irk *irk; 247755e76b38SJohan Hedberg u8 addr_type; 247855e76b38SJohan Hedberg 247955e76b38SJohan Hedberg if (type == BDADDR_BREDR) { 248055e76b38SJohan Hedberg if (hci_find_link_key(hdev, bdaddr)) 248155e76b38SJohan Hedberg return true; 248255e76b38SJohan Hedberg return false; 248355e76b38SJohan Hedberg } 248455e76b38SJohan Hedberg 248555e76b38SJohan Hedberg /* Convert to HCI addr type which struct smp_ltk uses */ 248655e76b38SJohan Hedberg if (type == BDADDR_LE_PUBLIC) 248755e76b38SJohan Hedberg addr_type = ADDR_LE_DEV_PUBLIC; 248855e76b38SJohan Hedberg else 248955e76b38SJohan Hedberg addr_type = ADDR_LE_DEV_RANDOM; 249055e76b38SJohan Hedberg 24914ba9faf3SJohan Hedberg irk = hci_get_irk(hdev, bdaddr, addr_type); 24924ba9faf3SJohan Hedberg if (irk) { 24934ba9faf3SJohan Hedberg bdaddr = &irk->bdaddr; 24944ba9faf3SJohan Hedberg addr_type = irk->addr_type; 24954ba9faf3SJohan Hedberg } 24964ba9faf3SJohan Hedberg 249755e76b38SJohan Hedberg rcu_read_lock(); 249855e76b38SJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 249987c8b28dSJohan Hedberg if (k->bdaddr_type == addr_type && !bacmp(bdaddr, &k->bdaddr)) { 250087c8b28dSJohan Hedberg rcu_read_unlock(); 250155e76b38SJohan Hedberg return true; 250255e76b38SJohan Hedberg } 250387c8b28dSJohan Hedberg } 250455e76b38SJohan Hedberg rcu_read_unlock(); 250555e76b38SJohan Hedberg 250655e76b38SJohan Hedberg return false; 250755e76b38SJohan Hedberg } 250855e76b38SJohan Hedberg 25096bd32326SVille Tervo /* HCI command timer function */ 251065cc2b49SMarcel Holtmann static void hci_cmd_timeout(struct work_struct *work) 25116bd32326SVille Tervo { 251265cc2b49SMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, 251365cc2b49SMarcel Holtmann cmd_timer.work); 25146bd32326SVille Tervo 2515bda4f23aSAndrei Emeltchenko if (hdev->sent_cmd) { 2516bda4f23aSAndrei Emeltchenko struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data; 2517bda4f23aSAndrei Emeltchenko u16 opcode = __le16_to_cpu(sent->opcode); 2518bda4f23aSAndrei Emeltchenko 2519bda4f23aSAndrei Emeltchenko BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode); 2520bda4f23aSAndrei Emeltchenko } else { 25216bd32326SVille Tervo BT_ERR("%s command tx timeout", hdev->name); 2522bda4f23aSAndrei Emeltchenko } 2523bda4f23aSAndrei Emeltchenko 25246bd32326SVille Tervo atomic_set(&hdev->cmd_cnt, 1); 2525c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 25266bd32326SVille Tervo } 25276bd32326SVille Tervo 25282763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev, 25296928a924SJohan Hedberg bdaddr_t *bdaddr, u8 bdaddr_type) 25302763eda6SSzymon Janc { 25312763eda6SSzymon Janc struct oob_data *data; 25322763eda6SSzymon Janc 25336928a924SJohan Hedberg list_for_each_entry(data, &hdev->remote_oob_data, list) { 25346928a924SJohan Hedberg if (bacmp(bdaddr, &data->bdaddr) != 0) 25356928a924SJohan Hedberg continue; 25366928a924SJohan Hedberg if (data->bdaddr_type != bdaddr_type) 25376928a924SJohan Hedberg continue; 25382763eda6SSzymon Janc return data; 25396928a924SJohan Hedberg } 25402763eda6SSzymon Janc 25412763eda6SSzymon Janc return NULL; 25422763eda6SSzymon Janc } 25432763eda6SSzymon Janc 25446928a924SJohan Hedberg int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, 25456928a924SJohan Hedberg u8 bdaddr_type) 25462763eda6SSzymon Janc { 25472763eda6SSzymon Janc struct oob_data *data; 25482763eda6SSzymon Janc 25496928a924SJohan Hedberg data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type); 25502763eda6SSzymon Janc if (!data) 25512763eda6SSzymon Janc return -ENOENT; 25522763eda6SSzymon Janc 25536928a924SJohan Hedberg BT_DBG("%s removing %pMR (%u)", hdev->name, bdaddr, bdaddr_type); 25542763eda6SSzymon Janc 25552763eda6SSzymon Janc list_del(&data->list); 25562763eda6SSzymon Janc kfree(data); 25572763eda6SSzymon Janc 25582763eda6SSzymon Janc return 0; 25592763eda6SSzymon Janc } 25602763eda6SSzymon Janc 256135f7498aSJohan Hedberg void hci_remote_oob_data_clear(struct hci_dev *hdev) 25622763eda6SSzymon Janc { 25632763eda6SSzymon Janc struct oob_data *data, *n; 25642763eda6SSzymon Janc 25652763eda6SSzymon Janc list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) { 25662763eda6SSzymon Janc list_del(&data->list); 25672763eda6SSzymon Janc kfree(data); 25682763eda6SSzymon Janc } 25692763eda6SSzymon Janc } 25702763eda6SSzymon Janc 25710798872eSMarcel Holtmann int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, 25726928a924SJohan Hedberg u8 bdaddr_type, u8 *hash192, u8 *rand192, 257338da1703SJohan Hedberg u8 *hash256, u8 *rand256) 25740798872eSMarcel Holtmann { 25750798872eSMarcel Holtmann struct oob_data *data; 25760798872eSMarcel Holtmann 25776928a924SJohan Hedberg data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type); 25780798872eSMarcel Holtmann if (!data) { 25790a14ab41SJohan Hedberg data = kmalloc(sizeof(*data), GFP_KERNEL); 25800798872eSMarcel Holtmann if (!data) 25810798872eSMarcel Holtmann return -ENOMEM; 25820798872eSMarcel Holtmann 25830798872eSMarcel Holtmann bacpy(&data->bdaddr, bdaddr); 25846928a924SJohan Hedberg data->bdaddr_type = bdaddr_type; 25850798872eSMarcel Holtmann list_add(&data->list, &hdev->remote_oob_data); 25860798872eSMarcel Holtmann } 25870798872eSMarcel Holtmann 258881328d5cSJohan Hedberg if (hash192 && rand192) { 25890798872eSMarcel Holtmann memcpy(data->hash192, hash192, sizeof(data->hash192)); 259038da1703SJohan Hedberg memcpy(data->rand192, rand192, sizeof(data->rand192)); 2591f7697b16SMarcel Holtmann if (hash256 && rand256) 2592f7697b16SMarcel Holtmann data->present = 0x03; 259381328d5cSJohan Hedberg } else { 259481328d5cSJohan Hedberg memset(data->hash192, 0, sizeof(data->hash192)); 259581328d5cSJohan Hedberg memset(data->rand192, 0, sizeof(data->rand192)); 2596f7697b16SMarcel Holtmann if (hash256 && rand256) 2597f7697b16SMarcel Holtmann data->present = 0x02; 2598f7697b16SMarcel Holtmann else 2599f7697b16SMarcel Holtmann data->present = 0x00; 260081328d5cSJohan Hedberg } 26010798872eSMarcel Holtmann 260281328d5cSJohan Hedberg if (hash256 && rand256) { 26030798872eSMarcel Holtmann memcpy(data->hash256, hash256, sizeof(data->hash256)); 260438da1703SJohan Hedberg memcpy(data->rand256, rand256, sizeof(data->rand256)); 260581328d5cSJohan Hedberg } else { 260681328d5cSJohan Hedberg memset(data->hash256, 0, sizeof(data->hash256)); 260781328d5cSJohan Hedberg memset(data->rand256, 0, sizeof(data->rand256)); 2608f7697b16SMarcel Holtmann if (hash192 && rand192) 2609f7697b16SMarcel Holtmann data->present = 0x01; 261081328d5cSJohan Hedberg } 26110798872eSMarcel Holtmann 26126ed93dc6SAndrei Emeltchenko BT_DBG("%s for %pMR", hdev->name, bdaddr); 26132763eda6SSzymon Janc 26142763eda6SSzymon Janc return 0; 26152763eda6SSzymon Janc } 26162763eda6SSzymon Janc 2617dcc36c16SJohan Hedberg struct bdaddr_list *hci_bdaddr_list_lookup(struct list_head *bdaddr_list, 2618b9ee0a78SMarcel Holtmann bdaddr_t *bdaddr, u8 type) 2619b2a66aadSAntti Julku { 2620b2a66aadSAntti Julku struct bdaddr_list *b; 2621b2a66aadSAntti Julku 2622dcc36c16SJohan Hedberg list_for_each_entry(b, bdaddr_list, list) { 2623b9ee0a78SMarcel Holtmann if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type) 2624b2a66aadSAntti Julku return b; 2625b9ee0a78SMarcel Holtmann } 2626b2a66aadSAntti Julku 2627b2a66aadSAntti Julku return NULL; 2628b2a66aadSAntti Julku } 2629b2a66aadSAntti Julku 2630dcc36c16SJohan Hedberg void hci_bdaddr_list_clear(struct list_head *bdaddr_list) 2631b2a66aadSAntti Julku { 2632b2a66aadSAntti Julku struct list_head *p, *n; 2633b2a66aadSAntti Julku 2634dcc36c16SJohan Hedberg list_for_each_safe(p, n, bdaddr_list) { 2635b9ee0a78SMarcel Holtmann struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list); 2636b2a66aadSAntti Julku 2637b2a66aadSAntti Julku list_del(p); 2638b2a66aadSAntti Julku kfree(b); 2639b2a66aadSAntti Julku } 2640b2a66aadSAntti Julku } 2641b2a66aadSAntti Julku 2642dcc36c16SJohan Hedberg int hci_bdaddr_list_add(struct list_head *list, bdaddr_t *bdaddr, u8 type) 2643b2a66aadSAntti Julku { 2644b2a66aadSAntti Julku struct bdaddr_list *entry; 2645b2a66aadSAntti Julku 2646b9ee0a78SMarcel Holtmann if (!bacmp(bdaddr, BDADDR_ANY)) 2647b2a66aadSAntti Julku return -EBADF; 2648b2a66aadSAntti Julku 2649dcc36c16SJohan Hedberg if (hci_bdaddr_list_lookup(list, bdaddr, type)) 26505e762444SAntti Julku return -EEXIST; 2651b2a66aadSAntti Julku 265227f70f3eSJohan Hedberg entry = kzalloc(sizeof(*entry), GFP_KERNEL); 26535e762444SAntti Julku if (!entry) 26545e762444SAntti Julku return -ENOMEM; 2655b2a66aadSAntti Julku 2656b2a66aadSAntti Julku bacpy(&entry->bdaddr, bdaddr); 2657b9ee0a78SMarcel Holtmann entry->bdaddr_type = type; 2658b2a66aadSAntti Julku 2659dcc36c16SJohan Hedberg list_add(&entry->list, list); 2660b2a66aadSAntti Julku 26612a8357f2SJohan Hedberg return 0; 2662b2a66aadSAntti Julku } 2663b2a66aadSAntti Julku 2664dcc36c16SJohan Hedberg int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, u8 type) 2665b2a66aadSAntti Julku { 2666b2a66aadSAntti Julku struct bdaddr_list *entry; 2667b2a66aadSAntti Julku 266835f7498aSJohan Hedberg if (!bacmp(bdaddr, BDADDR_ANY)) { 2669dcc36c16SJohan Hedberg hci_bdaddr_list_clear(list); 267035f7498aSJohan Hedberg return 0; 267135f7498aSJohan Hedberg } 2672b2a66aadSAntti Julku 2673dcc36c16SJohan Hedberg entry = hci_bdaddr_list_lookup(list, bdaddr, type); 2674d2ab0ac1SMarcel Holtmann if (!entry) 2675d2ab0ac1SMarcel Holtmann return -ENOENT; 2676d2ab0ac1SMarcel Holtmann 2677d2ab0ac1SMarcel Holtmann list_del(&entry->list); 2678d2ab0ac1SMarcel Holtmann kfree(entry); 2679d2ab0ac1SMarcel Holtmann 2680d2ab0ac1SMarcel Holtmann return 0; 2681d2ab0ac1SMarcel Holtmann } 2682d2ab0ac1SMarcel Holtmann 268315819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 268415819a70SAndre Guedes struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, 268515819a70SAndre Guedes bdaddr_t *addr, u8 addr_type) 268615819a70SAndre Guedes { 268715819a70SAndre Guedes struct hci_conn_params *params; 268815819a70SAndre Guedes 2689738f6185SJohan Hedberg /* The conn params list only contains identity addresses */ 2690738f6185SJohan Hedberg if (!hci_is_identity_address(addr, addr_type)) 2691738f6185SJohan Hedberg return NULL; 2692738f6185SJohan Hedberg 269315819a70SAndre Guedes list_for_each_entry(params, &hdev->le_conn_params, list) { 269415819a70SAndre Guedes if (bacmp(¶ms->addr, addr) == 0 && 269515819a70SAndre Guedes params->addr_type == addr_type) { 269615819a70SAndre Guedes return params; 269715819a70SAndre Guedes } 269815819a70SAndre Guedes } 269915819a70SAndre Guedes 270015819a70SAndre Guedes return NULL; 270115819a70SAndre Guedes } 270215819a70SAndre Guedes 270315819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 2704501f8827SJohan Hedberg struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list, 27054b10966fSMarcel Holtmann bdaddr_t *addr, u8 addr_type) 270615819a70SAndre Guedes { 2707912b42efSJohan Hedberg struct hci_conn_params *param; 270815819a70SAndre Guedes 2709738f6185SJohan Hedberg /* The list only contains identity addresses */ 2710738f6185SJohan Hedberg if (!hci_is_identity_address(addr, addr_type)) 2711738f6185SJohan Hedberg return NULL; 271215819a70SAndre Guedes 2713501f8827SJohan Hedberg list_for_each_entry(param, list, action) { 2714912b42efSJohan Hedberg if (bacmp(¶m->addr, addr) == 0 && 2715912b42efSJohan Hedberg param->addr_type == addr_type) 2716912b42efSJohan Hedberg return param; 27174b10966fSMarcel Holtmann } 27184b10966fSMarcel Holtmann 27194b10966fSMarcel Holtmann return NULL; 272015819a70SAndre Guedes } 272115819a70SAndre Guedes 272215819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 272351d167c0SMarcel Holtmann struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev, 272451d167c0SMarcel Holtmann bdaddr_t *addr, u8 addr_type) 272515819a70SAndre Guedes { 272615819a70SAndre Guedes struct hci_conn_params *params; 272715819a70SAndre Guedes 2728c46245b3SJohan Hedberg if (!hci_is_identity_address(addr, addr_type)) 272951d167c0SMarcel Holtmann return NULL; 2730a9b0a04cSAndre Guedes 273115819a70SAndre Guedes params = hci_conn_params_lookup(hdev, addr, addr_type); 2732cef952ceSAndre Guedes if (params) 273351d167c0SMarcel Holtmann return params; 273415819a70SAndre Guedes 273515819a70SAndre Guedes params = kzalloc(sizeof(*params), GFP_KERNEL); 273615819a70SAndre Guedes if (!params) { 273715819a70SAndre Guedes BT_ERR("Out of memory"); 273851d167c0SMarcel Holtmann return NULL; 273915819a70SAndre Guedes } 274015819a70SAndre Guedes 274115819a70SAndre Guedes bacpy(¶ms->addr, addr); 274215819a70SAndre Guedes params->addr_type = addr_type; 2743cef952ceSAndre Guedes 2744cef952ceSAndre Guedes list_add(¶ms->list, &hdev->le_conn_params); 274593450c75SJohan Hedberg INIT_LIST_HEAD(¶ms->action); 2746cef952ceSAndre Guedes 2747bf5b3c8bSMarcel Holtmann params->conn_min_interval = hdev->le_conn_min_interval; 2748bf5b3c8bSMarcel Holtmann params->conn_max_interval = hdev->le_conn_max_interval; 2749bf5b3c8bSMarcel Holtmann params->conn_latency = hdev->le_conn_latency; 2750bf5b3c8bSMarcel Holtmann params->supervision_timeout = hdev->le_supv_timeout; 2751bf5b3c8bSMarcel Holtmann params->auto_connect = HCI_AUTO_CONN_DISABLED; 2752bf5b3c8bSMarcel Holtmann 2753bf5b3c8bSMarcel Holtmann BT_DBG("addr %pMR (type %u)", addr, addr_type); 2754bf5b3c8bSMarcel Holtmann 275551d167c0SMarcel Holtmann return params; 2756bf5b3c8bSMarcel Holtmann } 2757bf5b3c8bSMarcel Holtmann 2758f6c63249SJohan Hedberg static void hci_conn_params_free(struct hci_conn_params *params) 2759f6c63249SJohan Hedberg { 2760f6c63249SJohan Hedberg if (params->conn) { 2761f6c63249SJohan Hedberg hci_conn_drop(params->conn); 2762f6c63249SJohan Hedberg hci_conn_put(params->conn); 2763f6c63249SJohan Hedberg } 2764f6c63249SJohan Hedberg 2765f6c63249SJohan Hedberg list_del(¶ms->action); 2766f6c63249SJohan Hedberg list_del(¶ms->list); 2767f6c63249SJohan Hedberg kfree(params); 2768f6c63249SJohan Hedberg } 2769f6c63249SJohan Hedberg 277015819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 277115819a70SAndre Guedes void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type) 277215819a70SAndre Guedes { 277315819a70SAndre Guedes struct hci_conn_params *params; 277415819a70SAndre Guedes 277515819a70SAndre Guedes params = hci_conn_params_lookup(hdev, addr, addr_type); 277615819a70SAndre Guedes if (!params) 277715819a70SAndre Guedes return; 277815819a70SAndre Guedes 2779f6c63249SJohan Hedberg hci_conn_params_free(params); 278015819a70SAndre Guedes 278195305baaSJohan Hedberg hci_update_background_scan(hdev); 278295305baaSJohan Hedberg 278315819a70SAndre Guedes BT_DBG("addr %pMR (type %u)", addr, addr_type); 278415819a70SAndre Guedes } 278515819a70SAndre Guedes 278615819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 278755af49a8SJohan Hedberg void hci_conn_params_clear_disabled(struct hci_dev *hdev) 278815819a70SAndre Guedes { 278915819a70SAndre Guedes struct hci_conn_params *params, *tmp; 279015819a70SAndre Guedes 279115819a70SAndre Guedes list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) { 279255af49a8SJohan Hedberg if (params->auto_connect != HCI_AUTO_CONN_DISABLED) 279355af49a8SJohan Hedberg continue; 279415819a70SAndre Guedes list_del(¶ms->list); 279515819a70SAndre Guedes kfree(params); 279615819a70SAndre Guedes } 279715819a70SAndre Guedes 279855af49a8SJohan Hedberg BT_DBG("All LE disabled connection parameters were removed"); 279955af49a8SJohan Hedberg } 280055af49a8SJohan Hedberg 280155af49a8SJohan Hedberg /* This function requires the caller holds hdev->lock */ 2802373110c5SJohan Hedberg void hci_conn_params_clear_all(struct hci_dev *hdev) 280315819a70SAndre Guedes { 280415819a70SAndre Guedes struct hci_conn_params *params, *tmp; 280515819a70SAndre Guedes 2806f6c63249SJohan Hedberg list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) 2807f6c63249SJohan Hedberg hci_conn_params_free(params); 280815819a70SAndre Guedes 2809a2f41a8fSJohan Hedberg hci_update_background_scan(hdev); 28101089b67dSMarcel Holtmann 281115819a70SAndre Guedes BT_DBG("All LE connection parameters were removed"); 281215819a70SAndre Guedes } 281315819a70SAndre Guedes 28141904a853SMarcel Holtmann static void inquiry_complete(struct hci_dev *hdev, u8 status, u16 opcode) 28157ba8b4beSAndre Guedes { 28164c87eaabSAndre Guedes if (status) { 28174c87eaabSAndre Guedes BT_ERR("Failed to start inquiry: status %d", status); 28187ba8b4beSAndre Guedes 28194c87eaabSAndre Guedes hci_dev_lock(hdev); 28204c87eaabSAndre Guedes hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 28214c87eaabSAndre Guedes hci_dev_unlock(hdev); 28224c87eaabSAndre Guedes return; 28234c87eaabSAndre Guedes } 28247ba8b4beSAndre Guedes } 28257ba8b4beSAndre Guedes 28261904a853SMarcel Holtmann static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status, 28271904a853SMarcel Holtmann u16 opcode) 28287ba8b4beSAndre Guedes { 28294c87eaabSAndre Guedes /* General inquiry access code (GIAC) */ 28304c87eaabSAndre Guedes u8 lap[3] = { 0x33, 0x8b, 0x9e }; 28314c87eaabSAndre Guedes struct hci_cp_inquiry cp; 28327ba8b4beSAndre Guedes int err; 28337ba8b4beSAndre Guedes 28344c87eaabSAndre Guedes if (status) { 28354c87eaabSAndre Guedes BT_ERR("Failed to disable LE scanning: status %d", status); 28364c87eaabSAndre Guedes return; 28377ba8b4beSAndre Guedes } 28387ba8b4beSAndre Guedes 28392d28cfe7SJakub Pawlowski hdev->discovery.scan_start = 0; 28402d28cfe7SJakub Pawlowski 28414c87eaabSAndre Guedes switch (hdev->discovery.type) { 28424c87eaabSAndre Guedes case DISCOV_TYPE_LE: 28434c87eaabSAndre Guedes hci_dev_lock(hdev); 28444c87eaabSAndre Guedes hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 28454c87eaabSAndre Guedes hci_dev_unlock(hdev); 28464c87eaabSAndre Guedes break; 28477dbfac1dSAndre Guedes 28484c87eaabSAndre Guedes case DISCOV_TYPE_INTERLEAVED: 28494c87eaabSAndre Guedes hci_dev_lock(hdev); 28504c87eaabSAndre Guedes 285107d2334aSJakub Pawlowski if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, 285207d2334aSJakub Pawlowski &hdev->quirks)) { 285307d2334aSJakub Pawlowski /* If we were running LE only scan, change discovery 285407d2334aSJakub Pawlowski * state. If we were running both LE and BR/EDR inquiry 285507d2334aSJakub Pawlowski * simultaneously, and BR/EDR inquiry is already 285607d2334aSJakub Pawlowski * finished, stop discovery, otherwise BR/EDR inquiry 285707d2334aSJakub Pawlowski * will stop discovery when finished. 285807d2334aSJakub Pawlowski */ 285907d2334aSJakub Pawlowski if (!test_bit(HCI_INQUIRY, &hdev->flags)) 286007d2334aSJakub Pawlowski hci_discovery_set_state(hdev, 286107d2334aSJakub Pawlowski DISCOVERY_STOPPED); 286207d2334aSJakub Pawlowski } else { 2863baf880a9SJohan Hedberg struct hci_request req; 2864baf880a9SJohan Hedberg 28654c87eaabSAndre Guedes hci_inquiry_cache_flush(hdev); 28664c87eaabSAndre Guedes 2867baf880a9SJohan Hedberg hci_req_init(&req, hdev); 2868baf880a9SJohan Hedberg 2869baf880a9SJohan Hedberg memset(&cp, 0, sizeof(cp)); 2870baf880a9SJohan Hedberg memcpy(&cp.lap, lap, sizeof(cp.lap)); 2871baf880a9SJohan Hedberg cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN; 2872baf880a9SJohan Hedberg hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp); 2873baf880a9SJohan Hedberg 28744c87eaabSAndre Guedes err = hci_req_run(&req, inquiry_complete); 28754c87eaabSAndre Guedes if (err) { 28764c87eaabSAndre Guedes BT_ERR("Inquiry request failed: err %d", err); 287707d2334aSJakub Pawlowski hci_discovery_set_state(hdev, 287807d2334aSJakub Pawlowski DISCOVERY_STOPPED); 287907d2334aSJakub Pawlowski } 28807dbfac1dSAndre Guedes } 28817dbfac1dSAndre Guedes 28824c87eaabSAndre Guedes hci_dev_unlock(hdev); 28834c87eaabSAndre Guedes break; 28844c87eaabSAndre Guedes } 28857dbfac1dSAndre Guedes } 28867dbfac1dSAndre Guedes 28877ba8b4beSAndre Guedes static void le_scan_disable_work(struct work_struct *work) 28887ba8b4beSAndre Guedes { 28897ba8b4beSAndre Guedes struct hci_dev *hdev = container_of(work, struct hci_dev, 28907ba8b4beSAndre Guedes le_scan_disable.work); 28914c87eaabSAndre Guedes struct hci_request req; 28924c87eaabSAndre Guedes int err; 28937ba8b4beSAndre Guedes 28947ba8b4beSAndre Guedes BT_DBG("%s", hdev->name); 28957ba8b4beSAndre Guedes 28962d28cfe7SJakub Pawlowski cancel_delayed_work_sync(&hdev->le_scan_restart); 28972d28cfe7SJakub Pawlowski 28984c87eaabSAndre Guedes hci_req_init(&req, hdev); 28997ba8b4beSAndre Guedes 2900b1efcc28SAndre Guedes hci_req_add_le_scan_disable(&req); 29017ba8b4beSAndre Guedes 29024c87eaabSAndre Guedes err = hci_req_run(&req, le_scan_disable_work_complete); 29034c87eaabSAndre Guedes if (err) 29044c87eaabSAndre Guedes BT_ERR("Disable LE scanning request failed: err %d", err); 290528b75a89SAndre Guedes } 290628b75a89SAndre Guedes 29072d28cfe7SJakub Pawlowski static void le_scan_restart_work_complete(struct hci_dev *hdev, u8 status, 29082d28cfe7SJakub Pawlowski u16 opcode) 29092d28cfe7SJakub Pawlowski { 29102d28cfe7SJakub Pawlowski unsigned long timeout, duration, scan_start, now; 29112d28cfe7SJakub Pawlowski 29122d28cfe7SJakub Pawlowski BT_DBG("%s", hdev->name); 29132d28cfe7SJakub Pawlowski 29142d28cfe7SJakub Pawlowski if (status) { 29152d28cfe7SJakub Pawlowski BT_ERR("Failed to restart LE scan: status %d", status); 29162d28cfe7SJakub Pawlowski return; 29172d28cfe7SJakub Pawlowski } 29182d28cfe7SJakub Pawlowski 29192d28cfe7SJakub Pawlowski if (!test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks) || 29202d28cfe7SJakub Pawlowski !hdev->discovery.scan_start) 29212d28cfe7SJakub Pawlowski return; 29222d28cfe7SJakub Pawlowski 29232d28cfe7SJakub Pawlowski /* When the scan was started, hdev->le_scan_disable has been queued 29242d28cfe7SJakub Pawlowski * after duration from scan_start. During scan restart this job 29252d28cfe7SJakub Pawlowski * has been canceled, and we need to queue it again after proper 29262d28cfe7SJakub Pawlowski * timeout, to make sure that scan does not run indefinitely. 29272d28cfe7SJakub Pawlowski */ 29282d28cfe7SJakub Pawlowski duration = hdev->discovery.scan_duration; 29292d28cfe7SJakub Pawlowski scan_start = hdev->discovery.scan_start; 29302d28cfe7SJakub Pawlowski now = jiffies; 29312d28cfe7SJakub Pawlowski if (now - scan_start <= duration) { 29322d28cfe7SJakub Pawlowski int elapsed; 29332d28cfe7SJakub Pawlowski 29342d28cfe7SJakub Pawlowski if (now >= scan_start) 29352d28cfe7SJakub Pawlowski elapsed = now - scan_start; 29362d28cfe7SJakub Pawlowski else 29372d28cfe7SJakub Pawlowski elapsed = ULONG_MAX - scan_start + now; 29382d28cfe7SJakub Pawlowski 29392d28cfe7SJakub Pawlowski timeout = duration - elapsed; 29402d28cfe7SJakub Pawlowski } else { 29412d28cfe7SJakub Pawlowski timeout = 0; 29422d28cfe7SJakub Pawlowski } 29432d28cfe7SJakub Pawlowski queue_delayed_work(hdev->workqueue, 29442d28cfe7SJakub Pawlowski &hdev->le_scan_disable, timeout); 29452d28cfe7SJakub Pawlowski } 29462d28cfe7SJakub Pawlowski 29472d28cfe7SJakub Pawlowski static void le_scan_restart_work(struct work_struct *work) 29482d28cfe7SJakub Pawlowski { 29492d28cfe7SJakub Pawlowski struct hci_dev *hdev = container_of(work, struct hci_dev, 29502d28cfe7SJakub Pawlowski le_scan_restart.work); 29512d28cfe7SJakub Pawlowski struct hci_request req; 29522d28cfe7SJakub Pawlowski struct hci_cp_le_set_scan_enable cp; 29532d28cfe7SJakub Pawlowski int err; 29542d28cfe7SJakub Pawlowski 29552d28cfe7SJakub Pawlowski BT_DBG("%s", hdev->name); 29562d28cfe7SJakub Pawlowski 29572d28cfe7SJakub Pawlowski /* If controller is not scanning we are done. */ 2958d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_LE_SCAN)) 29592d28cfe7SJakub Pawlowski return; 29602d28cfe7SJakub Pawlowski 29612d28cfe7SJakub Pawlowski hci_req_init(&req, hdev); 29622d28cfe7SJakub Pawlowski 29632d28cfe7SJakub Pawlowski hci_req_add_le_scan_disable(&req); 29642d28cfe7SJakub Pawlowski 29652d28cfe7SJakub Pawlowski memset(&cp, 0, sizeof(cp)); 29662d28cfe7SJakub Pawlowski cp.enable = LE_SCAN_ENABLE; 29672d28cfe7SJakub Pawlowski cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE; 29682d28cfe7SJakub Pawlowski hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp); 29692d28cfe7SJakub Pawlowski 29702d28cfe7SJakub Pawlowski err = hci_req_run(&req, le_scan_restart_work_complete); 29712d28cfe7SJakub Pawlowski if (err) 29722d28cfe7SJakub Pawlowski BT_ERR("Restart LE scan request failed: err %d", err); 29732d28cfe7SJakub Pawlowski } 29742d28cfe7SJakub Pawlowski 2975a1f4c318SJohan Hedberg /* Copy the Identity Address of the controller. 2976a1f4c318SJohan Hedberg * 2977a1f4c318SJohan Hedberg * If the controller has a public BD_ADDR, then by default use that one. 2978a1f4c318SJohan Hedberg * If this is a LE only controller without a public address, default to 2979a1f4c318SJohan Hedberg * the static random address. 2980a1f4c318SJohan Hedberg * 2981a1f4c318SJohan Hedberg * For debugging purposes it is possible to force controllers with a 2982a1f4c318SJohan Hedberg * public address to use the static random address instead. 298350b5b952SMarcel Holtmann * 298450b5b952SMarcel Holtmann * In case BR/EDR has been disabled on a dual-mode controller and 298550b5b952SMarcel Holtmann * userspace has configured a static address, then that address 298650b5b952SMarcel Holtmann * becomes the identity address instead of the public BR/EDR address. 2987a1f4c318SJohan Hedberg */ 2988a1f4c318SJohan Hedberg void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, 2989a1f4c318SJohan Hedberg u8 *bdaddr_type) 2990a1f4c318SJohan Hedberg { 2991b7cb93e5SMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || 299250b5b952SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) || 2993d7a5a11dSMarcel Holtmann (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && 299450b5b952SMarcel Holtmann bacmp(&hdev->static_addr, BDADDR_ANY))) { 2995a1f4c318SJohan Hedberg bacpy(bdaddr, &hdev->static_addr); 2996a1f4c318SJohan Hedberg *bdaddr_type = ADDR_LE_DEV_RANDOM; 2997a1f4c318SJohan Hedberg } else { 2998a1f4c318SJohan Hedberg bacpy(bdaddr, &hdev->bdaddr); 2999a1f4c318SJohan Hedberg *bdaddr_type = ADDR_LE_DEV_PUBLIC; 3000a1f4c318SJohan Hedberg } 3001a1f4c318SJohan Hedberg } 3002a1f4c318SJohan Hedberg 30039be0dab7SDavid Herrmann /* Alloc HCI device */ 30049be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void) 30059be0dab7SDavid Herrmann { 30069be0dab7SDavid Herrmann struct hci_dev *hdev; 30079be0dab7SDavid Herrmann 300827f70f3eSJohan Hedberg hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); 30099be0dab7SDavid Herrmann if (!hdev) 30109be0dab7SDavid Herrmann return NULL; 30119be0dab7SDavid Herrmann 3012b1b813d4SDavid Herrmann hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); 3013b1b813d4SDavid Herrmann hdev->esco_type = (ESCO_HV1); 3014b1b813d4SDavid Herrmann hdev->link_mode = (HCI_LM_ACCEPT); 3015b4cb9fb2SMarcel Holtmann hdev->num_iac = 0x01; /* One IAC support is mandatory */ 3016b1b813d4SDavid Herrmann hdev->io_capability = 0x03; /* No Input No Output */ 301796c2103aSMarcel Holtmann hdev->manufacturer = 0xffff; /* Default to internal use */ 3018bbaf444aSJohan Hedberg hdev->inq_tx_power = HCI_TX_POWER_INVALID; 3019bbaf444aSJohan Hedberg hdev->adv_tx_power = HCI_TX_POWER_INVALID; 3020b1b813d4SDavid Herrmann 3021b1b813d4SDavid Herrmann hdev->sniff_max_interval = 800; 3022b1b813d4SDavid Herrmann hdev->sniff_min_interval = 80; 3023b1b813d4SDavid Herrmann 30243f959d46SMarcel Holtmann hdev->le_adv_channel_map = 0x07; 3025628531c9SGeorg Lukas hdev->le_adv_min_interval = 0x0800; 3026628531c9SGeorg Lukas hdev->le_adv_max_interval = 0x0800; 3027bef64738SMarcel Holtmann hdev->le_scan_interval = 0x0060; 3028bef64738SMarcel Holtmann hdev->le_scan_window = 0x0030; 30294e70c7e7SMarcel Holtmann hdev->le_conn_min_interval = 0x0028; 30304e70c7e7SMarcel Holtmann hdev->le_conn_max_interval = 0x0038; 303104fb7d90SMarcel Holtmann hdev->le_conn_latency = 0x0000; 303204fb7d90SMarcel Holtmann hdev->le_supv_timeout = 0x002a; 3033a8e1bfaaSMarcel Holtmann hdev->le_def_tx_len = 0x001b; 3034a8e1bfaaSMarcel Holtmann hdev->le_def_tx_time = 0x0148; 3035a8e1bfaaSMarcel Holtmann hdev->le_max_tx_len = 0x001b; 3036a8e1bfaaSMarcel Holtmann hdev->le_max_tx_time = 0x0148; 3037a8e1bfaaSMarcel Holtmann hdev->le_max_rx_len = 0x001b; 3038a8e1bfaaSMarcel Holtmann hdev->le_max_rx_time = 0x0148; 3039bef64738SMarcel Holtmann 3040d6bfd59cSJohan Hedberg hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT; 3041b9a7a61eSLukasz Rymanowski hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT; 304231ad1691SAndrzej Kaczmarek hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE; 304331ad1691SAndrzej Kaczmarek hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE; 3044d6bfd59cSJohan Hedberg 3045b1b813d4SDavid Herrmann mutex_init(&hdev->lock); 3046b1b813d4SDavid Herrmann mutex_init(&hdev->req_lock); 3047b1b813d4SDavid Herrmann 3048b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->mgmt_pending); 3049b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->blacklist); 30506659358eSJohan Hedberg INIT_LIST_HEAD(&hdev->whitelist); 3051b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->uuids); 3052b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->link_keys); 3053b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->long_term_keys); 3054970c4e46SJohan Hedberg INIT_LIST_HEAD(&hdev->identity_resolving_keys); 3055b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->remote_oob_data); 3056d2ab0ac1SMarcel Holtmann INIT_LIST_HEAD(&hdev->le_white_list); 305715819a70SAndre Guedes INIT_LIST_HEAD(&hdev->le_conn_params); 305877a77a30SAndre Guedes INIT_LIST_HEAD(&hdev->pend_le_conns); 305966f8455aSJohan Hedberg INIT_LIST_HEAD(&hdev->pend_le_reports); 30606b536b5eSAndrei Emeltchenko INIT_LIST_HEAD(&hdev->conn_hash.list); 3061b1b813d4SDavid Herrmann 3062b1b813d4SDavid Herrmann INIT_WORK(&hdev->rx_work, hci_rx_work); 3063b1b813d4SDavid Herrmann INIT_WORK(&hdev->cmd_work, hci_cmd_work); 3064b1b813d4SDavid Herrmann INIT_WORK(&hdev->tx_work, hci_tx_work); 3065b1b813d4SDavid Herrmann INIT_WORK(&hdev->power_on, hci_power_on); 3066c7741d16SMarcel Holtmann INIT_WORK(&hdev->error_reset, hci_error_reset); 3067b1b813d4SDavid Herrmann 3068b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->power_off, hci_power_off); 3069b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off); 3070b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work); 30712d28cfe7SJakub Pawlowski INIT_DELAYED_WORK(&hdev->le_scan_restart, le_scan_restart_work); 3072b1b813d4SDavid Herrmann 3073b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->rx_q); 3074b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->cmd_q); 3075b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->raw_q); 3076b1b813d4SDavid Herrmann 3077b1b813d4SDavid Herrmann init_waitqueue_head(&hdev->req_wait_q); 3078b1b813d4SDavid Herrmann 307965cc2b49SMarcel Holtmann INIT_DELAYED_WORK(&hdev->cmd_timer, hci_cmd_timeout); 3080b1b813d4SDavid Herrmann 3081b1b813d4SDavid Herrmann hci_init_sysfs(hdev); 3082b1b813d4SDavid Herrmann discovery_init(hdev); 3083203fea01SArman Uguray adv_info_init(hdev); 30849be0dab7SDavid Herrmann 30859be0dab7SDavid Herrmann return hdev; 30869be0dab7SDavid Herrmann } 30879be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev); 30889be0dab7SDavid Herrmann 30899be0dab7SDavid Herrmann /* Free HCI device */ 30909be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev) 30919be0dab7SDavid Herrmann { 30929be0dab7SDavid Herrmann /* will free via device release */ 30939be0dab7SDavid Herrmann put_device(&hdev->dev); 30949be0dab7SDavid Herrmann } 30959be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev); 30969be0dab7SDavid Herrmann 30971da177e4SLinus Torvalds /* Register HCI device */ 30981da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev) 30991da177e4SLinus Torvalds { 3100b1b813d4SDavid Herrmann int id, error; 31011da177e4SLinus Torvalds 310274292d5aSMarcel Holtmann if (!hdev->open || !hdev->close || !hdev->send) 31031da177e4SLinus Torvalds return -EINVAL; 31041da177e4SLinus Torvalds 310508add513SMat Martineau /* Do not allow HCI_AMP devices to register at index 0, 310608add513SMat Martineau * so the index can be used as the AMP controller ID. 310708add513SMat Martineau */ 31083df92b31SSasha Levin switch (hdev->dev_type) { 31093df92b31SSasha Levin case HCI_BREDR: 31103df92b31SSasha Levin id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL); 31111da177e4SLinus Torvalds break; 31123df92b31SSasha Levin case HCI_AMP: 31133df92b31SSasha Levin id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL); 31143df92b31SSasha Levin break; 31153df92b31SSasha Levin default: 31163df92b31SSasha Levin return -EINVAL; 31171da177e4SLinus Torvalds } 31181da177e4SLinus Torvalds 31193df92b31SSasha Levin if (id < 0) 31203df92b31SSasha Levin return id; 31213df92b31SSasha Levin 31221da177e4SLinus Torvalds sprintf(hdev->name, "hci%d", id); 31231da177e4SLinus Torvalds hdev->id = id; 31242d8b3a11SAndrei Emeltchenko 31252d8b3a11SAndrei Emeltchenko BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); 31262d8b3a11SAndrei Emeltchenko 3127d8537548SKees Cook hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND | 3128d8537548SKees Cook WQ_MEM_RECLAIM, 1, hdev->name); 312933ca954dSDavid Herrmann if (!hdev->workqueue) { 313033ca954dSDavid Herrmann error = -ENOMEM; 313133ca954dSDavid Herrmann goto err; 313233ca954dSDavid Herrmann } 3133f48fd9c8SMarcel Holtmann 3134d8537548SKees Cook hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND | 3135d8537548SKees Cook WQ_MEM_RECLAIM, 1, hdev->name); 31366ead1bbcSJohan Hedberg if (!hdev->req_workqueue) { 31376ead1bbcSJohan Hedberg destroy_workqueue(hdev->workqueue); 31386ead1bbcSJohan Hedberg error = -ENOMEM; 31396ead1bbcSJohan Hedberg goto err; 31406ead1bbcSJohan Hedberg } 31416ead1bbcSJohan Hedberg 31420153e2ecSMarcel Holtmann if (!IS_ERR_OR_NULL(bt_debugfs)) 31430153e2ecSMarcel Holtmann hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs); 31440153e2ecSMarcel Holtmann 3145bdc3e0f1SMarcel Holtmann dev_set_name(&hdev->dev, "%s", hdev->name); 3146bdc3e0f1SMarcel Holtmann 3147bdc3e0f1SMarcel Holtmann error = device_add(&hdev->dev); 314833ca954dSDavid Herrmann if (error < 0) 314954506918SJohan Hedberg goto err_wqueue; 31501da177e4SLinus Torvalds 3151611b30f7SMarcel Holtmann hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev, 3152a8c5fb1aSGustavo Padovan RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops, 3153a8c5fb1aSGustavo Padovan hdev); 3154611b30f7SMarcel Holtmann if (hdev->rfkill) { 3155611b30f7SMarcel Holtmann if (rfkill_register(hdev->rfkill) < 0) { 3156611b30f7SMarcel Holtmann rfkill_destroy(hdev->rfkill); 3157611b30f7SMarcel Holtmann hdev->rfkill = NULL; 3158611b30f7SMarcel Holtmann } 3159611b30f7SMarcel Holtmann } 3160611b30f7SMarcel Holtmann 31615e130367SJohan Hedberg if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) 3162a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RFKILLED); 31635e130367SJohan Hedberg 3164a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_SETUP); 3165a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_AUTO_OFF); 3166ce2be9acSAndrei Emeltchenko 316701cd3404SMarcel Holtmann if (hdev->dev_type == HCI_BREDR) { 316856f87901SJohan Hedberg /* Assume BR/EDR support until proven otherwise (such as 316956f87901SJohan Hedberg * through reading supported features during init. 317056f87901SJohan Hedberg */ 3171a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); 317256f87901SJohan Hedberg } 3173ce2be9acSAndrei Emeltchenko 3174fcee3377SGustavo Padovan write_lock(&hci_dev_list_lock); 3175fcee3377SGustavo Padovan list_add(&hdev->list, &hci_dev_list); 3176fcee3377SGustavo Padovan write_unlock(&hci_dev_list_lock); 3177fcee3377SGustavo Padovan 31784a964404SMarcel Holtmann /* Devices that are marked for raw-only usage are unconfigured 31794a964404SMarcel Holtmann * and should not be included in normal operation. 3180fee746b0SMarcel Holtmann */ 3181fee746b0SMarcel Holtmann if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) 3182a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNCONFIGURED); 3183fee746b0SMarcel Holtmann 31841da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_REG); 3185dc946bd8SDavid Herrmann hci_dev_hold(hdev); 31861da177e4SLinus Torvalds 318719202573SJohan Hedberg queue_work(hdev->req_workqueue, &hdev->power_on); 3188fbe96d6fSMarcel Holtmann 31891da177e4SLinus Torvalds return id; 3190f48fd9c8SMarcel Holtmann 319133ca954dSDavid Herrmann err_wqueue: 319233ca954dSDavid Herrmann destroy_workqueue(hdev->workqueue); 31936ead1bbcSJohan Hedberg destroy_workqueue(hdev->req_workqueue); 319433ca954dSDavid Herrmann err: 31953df92b31SSasha Levin ida_simple_remove(&hci_index_ida, hdev->id); 3196f48fd9c8SMarcel Holtmann 319733ca954dSDavid Herrmann return error; 31981da177e4SLinus Torvalds } 31991da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev); 32001da177e4SLinus Torvalds 32011da177e4SLinus Torvalds /* Unregister HCI device */ 320259735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev) 32031da177e4SLinus Torvalds { 32042d7cc19eSMarcel Holtmann int id; 3205ef222013SMarcel Holtmann 3206c13854ceSMarcel Holtmann BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); 32071da177e4SLinus Torvalds 3208a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNREGISTER); 320994324962SJohan Hovold 32103df92b31SSasha Levin id = hdev->id; 32113df92b31SSasha Levin 3212f20d09d5SGustavo F. Padovan write_lock(&hci_dev_list_lock); 32131da177e4SLinus Torvalds list_del(&hdev->list); 3214f20d09d5SGustavo F. Padovan write_unlock(&hci_dev_list_lock); 32151da177e4SLinus Torvalds 32161da177e4SLinus Torvalds hci_dev_do_close(hdev); 32171da177e4SLinus Torvalds 3218b9b5ef18SGustavo Padovan cancel_work_sync(&hdev->power_on); 3219b9b5ef18SGustavo Padovan 3220ab81cbf9SJohan Hedberg if (!test_bit(HCI_INIT, &hdev->flags) && 3221d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_SETUP) && 3222d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) { 322309fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 3224744cf19eSJohan Hedberg mgmt_index_removed(hdev); 322509fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 322656e5cb86SJohan Hedberg } 3227ab81cbf9SJohan Hedberg 32282e58ef3eSJohan Hedberg /* mgmt_index_removed should take care of emptying the 32292e58ef3eSJohan Hedberg * pending list */ 32302e58ef3eSJohan Hedberg BUG_ON(!list_empty(&hdev->mgmt_pending)); 32312e58ef3eSJohan Hedberg 32321da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_UNREG); 32331da177e4SLinus Torvalds 3234611b30f7SMarcel Holtmann if (hdev->rfkill) { 3235611b30f7SMarcel Holtmann rfkill_unregister(hdev->rfkill); 3236611b30f7SMarcel Holtmann rfkill_destroy(hdev->rfkill); 3237611b30f7SMarcel Holtmann } 3238611b30f7SMarcel Holtmann 3239bdc3e0f1SMarcel Holtmann device_del(&hdev->dev); 3240147e2d59SDave Young 32410153e2ecSMarcel Holtmann debugfs_remove_recursive(hdev->debugfs); 32420153e2ecSMarcel Holtmann 3243f48fd9c8SMarcel Holtmann destroy_workqueue(hdev->workqueue); 32446ead1bbcSJohan Hedberg destroy_workqueue(hdev->req_workqueue); 3245f48fd9c8SMarcel Holtmann 324609fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 3247dcc36c16SJohan Hedberg hci_bdaddr_list_clear(&hdev->blacklist); 32486659358eSJohan Hedberg hci_bdaddr_list_clear(&hdev->whitelist); 32492aeb9a1aSJohan Hedberg hci_uuids_clear(hdev); 325055ed8ca1SJohan Hedberg hci_link_keys_clear(hdev); 3251b899efafSVinicius Costa Gomes hci_smp_ltks_clear(hdev); 3252970c4e46SJohan Hedberg hci_smp_irks_clear(hdev); 32532763eda6SSzymon Janc hci_remote_oob_data_clear(hdev); 3254dcc36c16SJohan Hedberg hci_bdaddr_list_clear(&hdev->le_white_list); 3255373110c5SJohan Hedberg hci_conn_params_clear_all(hdev); 325622078800SMarcel Holtmann hci_discovery_filter_clear(hdev); 325709fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 3258e2e0cacbSJohan Hedberg 3259dc946bd8SDavid Herrmann hci_dev_put(hdev); 32603df92b31SSasha Levin 32613df92b31SSasha Levin ida_simple_remove(&hci_index_ida, id); 32621da177e4SLinus Torvalds } 32631da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev); 32641da177e4SLinus Torvalds 32651da177e4SLinus Torvalds /* Suspend HCI device */ 32661da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev) 32671da177e4SLinus Torvalds { 32681da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_SUSPEND); 32691da177e4SLinus Torvalds return 0; 32701da177e4SLinus Torvalds } 32711da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev); 32721da177e4SLinus Torvalds 32731da177e4SLinus Torvalds /* Resume HCI device */ 32741da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev) 32751da177e4SLinus Torvalds { 32761da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_RESUME); 32771da177e4SLinus Torvalds return 0; 32781da177e4SLinus Torvalds } 32791da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev); 32801da177e4SLinus Torvalds 328175e0569fSMarcel Holtmann /* Reset HCI device */ 328275e0569fSMarcel Holtmann int hci_reset_dev(struct hci_dev *hdev) 328375e0569fSMarcel Holtmann { 328475e0569fSMarcel Holtmann const u8 hw_err[] = { HCI_EV_HARDWARE_ERROR, 0x01, 0x00 }; 328575e0569fSMarcel Holtmann struct sk_buff *skb; 328675e0569fSMarcel Holtmann 328775e0569fSMarcel Holtmann skb = bt_skb_alloc(3, GFP_ATOMIC); 328875e0569fSMarcel Holtmann if (!skb) 328975e0569fSMarcel Holtmann return -ENOMEM; 329075e0569fSMarcel Holtmann 329175e0569fSMarcel Holtmann bt_cb(skb)->pkt_type = HCI_EVENT_PKT; 329275e0569fSMarcel Holtmann memcpy(skb_put(skb, 3), hw_err, 3); 329375e0569fSMarcel Holtmann 329475e0569fSMarcel Holtmann /* Send Hardware Error to upper stack */ 329575e0569fSMarcel Holtmann return hci_recv_frame(hdev, skb); 329675e0569fSMarcel Holtmann } 329775e0569fSMarcel Holtmann EXPORT_SYMBOL(hci_reset_dev); 329875e0569fSMarcel Holtmann 329976bca880SMarcel Holtmann /* Receive frame from HCI drivers */ 3300e1a26170SMarcel Holtmann int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb) 330176bca880SMarcel Holtmann { 330276bca880SMarcel Holtmann if (!hdev || (!test_bit(HCI_UP, &hdev->flags) 330376bca880SMarcel Holtmann && !test_bit(HCI_INIT, &hdev->flags))) { 330476bca880SMarcel Holtmann kfree_skb(skb); 330576bca880SMarcel Holtmann return -ENXIO; 330676bca880SMarcel Holtmann } 330776bca880SMarcel Holtmann 3308d82603c6SJorrit Schippers /* Incoming skb */ 330976bca880SMarcel Holtmann bt_cb(skb)->incoming = 1; 331076bca880SMarcel Holtmann 331176bca880SMarcel Holtmann /* Time stamp */ 331276bca880SMarcel Holtmann __net_timestamp(skb); 331376bca880SMarcel Holtmann 331476bca880SMarcel Holtmann skb_queue_tail(&hdev->rx_q, skb); 3315b78752ccSMarcel Holtmann queue_work(hdev->workqueue, &hdev->rx_work); 3316c78ae283SMarcel Holtmann 331776bca880SMarcel Holtmann return 0; 331876bca880SMarcel Holtmann } 331976bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame); 332076bca880SMarcel Holtmann 33211da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */ 33221da177e4SLinus Torvalds 33231da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb) 33241da177e4SLinus Torvalds { 33251da177e4SLinus Torvalds BT_DBG("%p name %s", cb, cb->name); 33261da177e4SLinus Torvalds 3327fba7ecf0SJohan Hedberg mutex_lock(&hci_cb_list_lock); 332800629e0fSJohan Hedberg list_add_tail(&cb->list, &hci_cb_list); 3329fba7ecf0SJohan Hedberg mutex_unlock(&hci_cb_list_lock); 33301da177e4SLinus Torvalds 33311da177e4SLinus Torvalds return 0; 33321da177e4SLinus Torvalds } 33331da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb); 33341da177e4SLinus Torvalds 33351da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb) 33361da177e4SLinus Torvalds { 33371da177e4SLinus Torvalds BT_DBG("%p name %s", cb, cb->name); 33381da177e4SLinus Torvalds 3339fba7ecf0SJohan Hedberg mutex_lock(&hci_cb_list_lock); 33401da177e4SLinus Torvalds list_del(&cb->list); 3341fba7ecf0SJohan Hedberg mutex_unlock(&hci_cb_list_lock); 33421da177e4SLinus Torvalds 33431da177e4SLinus Torvalds return 0; 33441da177e4SLinus Torvalds } 33451da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb); 33461da177e4SLinus Torvalds 334751086991SMarcel Holtmann static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) 33481da177e4SLinus Torvalds { 3349cdc52faaSMarcel Holtmann int err; 3350cdc52faaSMarcel Holtmann 33510d48d939SMarcel Holtmann BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len); 33521da177e4SLinus Torvalds 33531da177e4SLinus Torvalds /* Time stamp */ 3354a61bbcf2SPatrick McHardy __net_timestamp(skb); 33551da177e4SLinus Torvalds 3356cd82e61cSMarcel Holtmann /* Send copy to monitor */ 3357cd82e61cSMarcel Holtmann hci_send_to_monitor(hdev, skb); 3358cd82e61cSMarcel Holtmann 3359cd82e61cSMarcel Holtmann if (atomic_read(&hdev->promisc)) { 3360cd82e61cSMarcel Holtmann /* Send copy to the sockets */ 3361470fe1b5SMarcel Holtmann hci_send_to_sock(hdev, skb); 33621da177e4SLinus Torvalds } 33631da177e4SLinus Torvalds 33641da177e4SLinus Torvalds /* Get rid of skb owner, prior to sending to the driver. */ 33651da177e4SLinus Torvalds skb_orphan(skb); 33661da177e4SLinus Torvalds 3367cdc52faaSMarcel Holtmann err = hdev->send(hdev, skb); 3368cdc52faaSMarcel Holtmann if (err < 0) { 3369cdc52faaSMarcel Holtmann BT_ERR("%s sending frame failed (%d)", hdev->name, err); 3370cdc52faaSMarcel Holtmann kfree_skb(skb); 3371cdc52faaSMarcel Holtmann } 33721da177e4SLinus Torvalds } 33731da177e4SLinus Torvalds 33741ca3a9d0SJohan Hedberg /* Send HCI command */ 337507dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, 337607dc93ddSJohan Hedberg const void *param) 33771ca3a9d0SJohan Hedberg { 33781ca3a9d0SJohan Hedberg struct sk_buff *skb; 33791ca3a9d0SJohan Hedberg 33801ca3a9d0SJohan Hedberg BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen); 33811ca3a9d0SJohan Hedberg 33821ca3a9d0SJohan Hedberg skb = hci_prepare_cmd(hdev, opcode, plen, param); 33831ca3a9d0SJohan Hedberg if (!skb) { 33841ca3a9d0SJohan Hedberg BT_ERR("%s no memory for command", hdev->name); 33851ca3a9d0SJohan Hedberg return -ENOMEM; 33861ca3a9d0SJohan Hedberg } 33871ca3a9d0SJohan Hedberg 338849c922bbSStephen Hemminger /* Stand-alone HCI commands must be flagged as 338911714b3dSJohan Hedberg * single-command requests. 339011714b3dSJohan Hedberg */ 3391db6e3e8dSJohan Hedberg bt_cb(skb)->req.start = true; 339211714b3dSJohan Hedberg 33931da177e4SLinus Torvalds skb_queue_tail(&hdev->cmd_q, skb); 3394c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 33951da177e4SLinus Torvalds 33961da177e4SLinus Torvalds return 0; 33971da177e4SLinus Torvalds } 33981da177e4SLinus Torvalds 33991da177e4SLinus Torvalds /* Get data from the previously sent command */ 3400a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode) 34011da177e4SLinus Torvalds { 34021da177e4SLinus Torvalds struct hci_command_hdr *hdr; 34031da177e4SLinus Torvalds 34041da177e4SLinus Torvalds if (!hdev->sent_cmd) 34051da177e4SLinus Torvalds return NULL; 34061da177e4SLinus Torvalds 34071da177e4SLinus Torvalds hdr = (void *) hdev->sent_cmd->data; 34081da177e4SLinus Torvalds 3409a9de9248SMarcel Holtmann if (hdr->opcode != cpu_to_le16(opcode)) 34101da177e4SLinus Torvalds return NULL; 34111da177e4SLinus Torvalds 3412f0e09510SAndrei Emeltchenko BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode); 34131da177e4SLinus Torvalds 34141da177e4SLinus Torvalds return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE; 34151da177e4SLinus Torvalds } 34161da177e4SLinus Torvalds 34171da177e4SLinus Torvalds /* Send ACL data */ 34181da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags) 34191da177e4SLinus Torvalds { 34201da177e4SLinus Torvalds struct hci_acl_hdr *hdr; 34211da177e4SLinus Torvalds int len = skb->len; 34221da177e4SLinus Torvalds 3423badff6d0SArnaldo Carvalho de Melo skb_push(skb, HCI_ACL_HDR_SIZE); 3424badff6d0SArnaldo Carvalho de Melo skb_reset_transport_header(skb); 34259c70220bSArnaldo Carvalho de Melo hdr = (struct hci_acl_hdr *)skb_transport_header(skb); 3426aca3192cSYOSHIFUJI Hideaki hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags)); 3427aca3192cSYOSHIFUJI Hideaki hdr->dlen = cpu_to_le16(len); 34281da177e4SLinus Torvalds } 34291da177e4SLinus Torvalds 3430ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue, 343173d80debSLuiz Augusto von Dentz struct sk_buff *skb, __u16 flags) 34321da177e4SLinus Torvalds { 3433ee22be7eSAndrei Emeltchenko struct hci_conn *conn = chan->conn; 34341da177e4SLinus Torvalds struct hci_dev *hdev = conn->hdev; 34351da177e4SLinus Torvalds struct sk_buff *list; 34361da177e4SLinus Torvalds 3437087bfd99SGustavo Padovan skb->len = skb_headlen(skb); 3438087bfd99SGustavo Padovan skb->data_len = 0; 3439087bfd99SGustavo Padovan 3440087bfd99SGustavo Padovan bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; 3441204a6e54SAndrei Emeltchenko 3442204a6e54SAndrei Emeltchenko switch (hdev->dev_type) { 3443204a6e54SAndrei Emeltchenko case HCI_BREDR: 3444087bfd99SGustavo Padovan hci_add_acl_hdr(skb, conn->handle, flags); 3445204a6e54SAndrei Emeltchenko break; 3446204a6e54SAndrei Emeltchenko case HCI_AMP: 3447204a6e54SAndrei Emeltchenko hci_add_acl_hdr(skb, chan->handle, flags); 3448204a6e54SAndrei Emeltchenko break; 3449204a6e54SAndrei Emeltchenko default: 3450204a6e54SAndrei Emeltchenko BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type); 3451204a6e54SAndrei Emeltchenko return; 3452204a6e54SAndrei Emeltchenko } 3453087bfd99SGustavo Padovan 345470f23020SAndrei Emeltchenko list = skb_shinfo(skb)->frag_list; 345570f23020SAndrei Emeltchenko if (!list) { 34561da177e4SLinus Torvalds /* Non fragmented */ 34571da177e4SLinus Torvalds BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len); 34581da177e4SLinus Torvalds 345973d80debSLuiz Augusto von Dentz skb_queue_tail(queue, skb); 34601da177e4SLinus Torvalds } else { 34611da177e4SLinus Torvalds /* Fragmented */ 34621da177e4SLinus Torvalds BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len); 34631da177e4SLinus Torvalds 34641da177e4SLinus Torvalds skb_shinfo(skb)->frag_list = NULL; 34651da177e4SLinus Torvalds 34669cfd5a23SJukka Rissanen /* Queue all fragments atomically. We need to use spin_lock_bh 34679cfd5a23SJukka Rissanen * here because of 6LoWPAN links, as there this function is 34689cfd5a23SJukka Rissanen * called from softirq and using normal spin lock could cause 34699cfd5a23SJukka Rissanen * deadlocks. 34709cfd5a23SJukka Rissanen */ 34719cfd5a23SJukka Rissanen spin_lock_bh(&queue->lock); 34721da177e4SLinus Torvalds 347373d80debSLuiz Augusto von Dentz __skb_queue_tail(queue, skb); 3474e702112fSAndrei Emeltchenko 3475e702112fSAndrei Emeltchenko flags &= ~ACL_START; 3476e702112fSAndrei Emeltchenko flags |= ACL_CONT; 34771da177e4SLinus Torvalds do { 34781da177e4SLinus Torvalds skb = list; list = list->next; 34791da177e4SLinus Torvalds 34800d48d939SMarcel Holtmann bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; 3481e702112fSAndrei Emeltchenko hci_add_acl_hdr(skb, conn->handle, flags); 34821da177e4SLinus Torvalds 34831da177e4SLinus Torvalds BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len); 34841da177e4SLinus Torvalds 348573d80debSLuiz Augusto von Dentz __skb_queue_tail(queue, skb); 34861da177e4SLinus Torvalds } while (list); 34871da177e4SLinus Torvalds 34889cfd5a23SJukka Rissanen spin_unlock_bh(&queue->lock); 34891da177e4SLinus Torvalds } 349073d80debSLuiz Augusto von Dentz } 349173d80debSLuiz Augusto von Dentz 349273d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags) 349373d80debSLuiz Augusto von Dentz { 3494ee22be7eSAndrei Emeltchenko struct hci_dev *hdev = chan->conn->hdev; 349573d80debSLuiz Augusto von Dentz 3496f0e09510SAndrei Emeltchenko BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags); 349773d80debSLuiz Augusto von Dentz 3498ee22be7eSAndrei Emeltchenko hci_queue_acl(chan, &chan->data_q, skb, flags); 34991da177e4SLinus Torvalds 35003eff45eaSGustavo F. Padovan queue_work(hdev->workqueue, &hdev->tx_work); 35011da177e4SLinus Torvalds } 35021da177e4SLinus Torvalds 35031da177e4SLinus Torvalds /* Send SCO data */ 35040d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb) 35051da177e4SLinus Torvalds { 35061da177e4SLinus Torvalds struct hci_dev *hdev = conn->hdev; 35071da177e4SLinus Torvalds struct hci_sco_hdr hdr; 35081da177e4SLinus Torvalds 35091da177e4SLinus Torvalds BT_DBG("%s len %d", hdev->name, skb->len); 35101da177e4SLinus Torvalds 3511aca3192cSYOSHIFUJI Hideaki hdr.handle = cpu_to_le16(conn->handle); 35121da177e4SLinus Torvalds hdr.dlen = skb->len; 35131da177e4SLinus Torvalds 3514badff6d0SArnaldo Carvalho de Melo skb_push(skb, HCI_SCO_HDR_SIZE); 3515badff6d0SArnaldo Carvalho de Melo skb_reset_transport_header(skb); 35169c70220bSArnaldo Carvalho de Melo memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE); 35171da177e4SLinus Torvalds 35180d48d939SMarcel Holtmann bt_cb(skb)->pkt_type = HCI_SCODATA_PKT; 3519c78ae283SMarcel Holtmann 35201da177e4SLinus Torvalds skb_queue_tail(&conn->data_q, skb); 35213eff45eaSGustavo F. Padovan queue_work(hdev->workqueue, &hdev->tx_work); 35221da177e4SLinus Torvalds } 35231da177e4SLinus Torvalds 35241da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */ 35251da177e4SLinus Torvalds 35261da177e4SLinus Torvalds /* HCI Connection scheduler */ 35276039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type, 3528a8c5fb1aSGustavo Padovan int *quote) 35291da177e4SLinus Torvalds { 35301da177e4SLinus Torvalds struct hci_conn_hash *h = &hdev->conn_hash; 35318035ded4SLuiz Augusto von Dentz struct hci_conn *conn = NULL, *c; 3532abc5de8fSMikel Astiz unsigned int num = 0, min = ~0; 35331da177e4SLinus Torvalds 35341da177e4SLinus Torvalds /* We don't have to lock device here. Connections are always 35351da177e4SLinus Torvalds * added and removed with TX task disabled. */ 3536bf4c6325SGustavo F. Padovan 3537bf4c6325SGustavo F. Padovan rcu_read_lock(); 3538bf4c6325SGustavo F. Padovan 3539bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(c, &h->list, list) { 3540769be974SMarcel Holtmann if (c->type != type || skb_queue_empty(&c->data_q)) 35411da177e4SLinus Torvalds continue; 3542769be974SMarcel Holtmann 3543769be974SMarcel Holtmann if (c->state != BT_CONNECTED && c->state != BT_CONFIG) 3544769be974SMarcel Holtmann continue; 3545769be974SMarcel Holtmann 35461da177e4SLinus Torvalds num++; 35471da177e4SLinus Torvalds 35481da177e4SLinus Torvalds if (c->sent < min) { 35491da177e4SLinus Torvalds min = c->sent; 35501da177e4SLinus Torvalds conn = c; 35511da177e4SLinus Torvalds } 355252087a79SLuiz Augusto von Dentz 355352087a79SLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == num) 355452087a79SLuiz Augusto von Dentz break; 35551da177e4SLinus Torvalds } 35561da177e4SLinus Torvalds 3557bf4c6325SGustavo F. Padovan rcu_read_unlock(); 3558bf4c6325SGustavo F. Padovan 35591da177e4SLinus Torvalds if (conn) { 35606ed58ec5SVille Tervo int cnt, q; 35616ed58ec5SVille Tervo 35626ed58ec5SVille Tervo switch (conn->type) { 35636ed58ec5SVille Tervo case ACL_LINK: 35646ed58ec5SVille Tervo cnt = hdev->acl_cnt; 35656ed58ec5SVille Tervo break; 35666ed58ec5SVille Tervo case SCO_LINK: 35676ed58ec5SVille Tervo case ESCO_LINK: 35686ed58ec5SVille Tervo cnt = hdev->sco_cnt; 35696ed58ec5SVille Tervo break; 35706ed58ec5SVille Tervo case LE_LINK: 35716ed58ec5SVille Tervo cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt; 35726ed58ec5SVille Tervo break; 35736ed58ec5SVille Tervo default: 35746ed58ec5SVille Tervo cnt = 0; 35756ed58ec5SVille Tervo BT_ERR("Unknown link type"); 35766ed58ec5SVille Tervo } 35776ed58ec5SVille Tervo 35786ed58ec5SVille Tervo q = cnt / num; 35791da177e4SLinus Torvalds *quote = q ? q : 1; 35801da177e4SLinus Torvalds } else 35811da177e4SLinus Torvalds *quote = 0; 35821da177e4SLinus Torvalds 35831da177e4SLinus Torvalds BT_DBG("conn %p quote %d", conn, *quote); 35841da177e4SLinus Torvalds return conn; 35851da177e4SLinus Torvalds } 35861da177e4SLinus Torvalds 35876039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type) 35881da177e4SLinus Torvalds { 35891da177e4SLinus Torvalds struct hci_conn_hash *h = &hdev->conn_hash; 35901da177e4SLinus Torvalds struct hci_conn *c; 35911da177e4SLinus Torvalds 3592bae1f5d9SVille Tervo BT_ERR("%s link tx timeout", hdev->name); 35931da177e4SLinus Torvalds 3594bf4c6325SGustavo F. Padovan rcu_read_lock(); 3595bf4c6325SGustavo F. Padovan 35961da177e4SLinus Torvalds /* Kill stalled connections */ 3597bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(c, &h->list, list) { 3598bae1f5d9SVille Tervo if (c->type == type && c->sent) { 35996ed93dc6SAndrei Emeltchenko BT_ERR("%s killing stalled connection %pMR", 36006ed93dc6SAndrei Emeltchenko hdev->name, &c->dst); 3601bed71748SAndre Guedes hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM); 36021da177e4SLinus Torvalds } 36031da177e4SLinus Torvalds } 3604bf4c6325SGustavo F. Padovan 3605bf4c6325SGustavo F. Padovan rcu_read_unlock(); 36061da177e4SLinus Torvalds } 36071da177e4SLinus Torvalds 36086039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type, 360973d80debSLuiz Augusto von Dentz int *quote) 361073d80debSLuiz Augusto von Dentz { 361173d80debSLuiz Augusto von Dentz struct hci_conn_hash *h = &hdev->conn_hash; 361273d80debSLuiz Augusto von Dentz struct hci_chan *chan = NULL; 3613abc5de8fSMikel Astiz unsigned int num = 0, min = ~0, cur_prio = 0; 361473d80debSLuiz Augusto von Dentz struct hci_conn *conn; 361573d80debSLuiz Augusto von Dentz int cnt, q, conn_num = 0; 361673d80debSLuiz Augusto von Dentz 361773d80debSLuiz Augusto von Dentz BT_DBG("%s", hdev->name); 361873d80debSLuiz Augusto von Dentz 3619bf4c6325SGustavo F. Padovan rcu_read_lock(); 3620bf4c6325SGustavo F. Padovan 3621bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(conn, &h->list, list) { 362273d80debSLuiz Augusto von Dentz struct hci_chan *tmp; 362373d80debSLuiz Augusto von Dentz 362473d80debSLuiz Augusto von Dentz if (conn->type != type) 362573d80debSLuiz Augusto von Dentz continue; 362673d80debSLuiz Augusto von Dentz 362773d80debSLuiz Augusto von Dentz if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG) 362873d80debSLuiz Augusto von Dentz continue; 362973d80debSLuiz Augusto von Dentz 363073d80debSLuiz Augusto von Dentz conn_num++; 363173d80debSLuiz Augusto von Dentz 36328192edefSGustavo F. Padovan list_for_each_entry_rcu(tmp, &conn->chan_list, list) { 363373d80debSLuiz Augusto von Dentz struct sk_buff *skb; 363473d80debSLuiz Augusto von Dentz 363573d80debSLuiz Augusto von Dentz if (skb_queue_empty(&tmp->data_q)) 363673d80debSLuiz Augusto von Dentz continue; 363773d80debSLuiz Augusto von Dentz 363873d80debSLuiz Augusto von Dentz skb = skb_peek(&tmp->data_q); 363973d80debSLuiz Augusto von Dentz if (skb->priority < cur_prio) 364073d80debSLuiz Augusto von Dentz continue; 364173d80debSLuiz Augusto von Dentz 364273d80debSLuiz Augusto von Dentz if (skb->priority > cur_prio) { 364373d80debSLuiz Augusto von Dentz num = 0; 364473d80debSLuiz Augusto von Dentz min = ~0; 364573d80debSLuiz Augusto von Dentz cur_prio = skb->priority; 364673d80debSLuiz Augusto von Dentz } 364773d80debSLuiz Augusto von Dentz 364873d80debSLuiz Augusto von Dentz num++; 364973d80debSLuiz Augusto von Dentz 365073d80debSLuiz Augusto von Dentz if (conn->sent < min) { 365173d80debSLuiz Augusto von Dentz min = conn->sent; 365273d80debSLuiz Augusto von Dentz chan = tmp; 365373d80debSLuiz Augusto von Dentz } 365473d80debSLuiz Augusto von Dentz } 365573d80debSLuiz Augusto von Dentz 365673d80debSLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == conn_num) 365773d80debSLuiz Augusto von Dentz break; 365873d80debSLuiz Augusto von Dentz } 365973d80debSLuiz Augusto von Dentz 3660bf4c6325SGustavo F. Padovan rcu_read_unlock(); 3661bf4c6325SGustavo F. Padovan 366273d80debSLuiz Augusto von Dentz if (!chan) 366373d80debSLuiz Augusto von Dentz return NULL; 366473d80debSLuiz Augusto von Dentz 366573d80debSLuiz Augusto von Dentz switch (chan->conn->type) { 366673d80debSLuiz Augusto von Dentz case ACL_LINK: 366773d80debSLuiz Augusto von Dentz cnt = hdev->acl_cnt; 366873d80debSLuiz Augusto von Dentz break; 3669bd1eb66bSAndrei Emeltchenko case AMP_LINK: 3670bd1eb66bSAndrei Emeltchenko cnt = hdev->block_cnt; 3671bd1eb66bSAndrei Emeltchenko break; 367273d80debSLuiz Augusto von Dentz case SCO_LINK: 367373d80debSLuiz Augusto von Dentz case ESCO_LINK: 367473d80debSLuiz Augusto von Dentz cnt = hdev->sco_cnt; 367573d80debSLuiz Augusto von Dentz break; 367673d80debSLuiz Augusto von Dentz case LE_LINK: 367773d80debSLuiz Augusto von Dentz cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt; 367873d80debSLuiz Augusto von Dentz break; 367973d80debSLuiz Augusto von Dentz default: 368073d80debSLuiz Augusto von Dentz cnt = 0; 368173d80debSLuiz Augusto von Dentz BT_ERR("Unknown link type"); 368273d80debSLuiz Augusto von Dentz } 368373d80debSLuiz Augusto von Dentz 368473d80debSLuiz Augusto von Dentz q = cnt / num; 368573d80debSLuiz Augusto von Dentz *quote = q ? q : 1; 368673d80debSLuiz Augusto von Dentz BT_DBG("chan %p quote %d", chan, *quote); 368773d80debSLuiz Augusto von Dentz return chan; 368873d80debSLuiz Augusto von Dentz } 368973d80debSLuiz Augusto von Dentz 369002b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type) 369102b20f0bSLuiz Augusto von Dentz { 369202b20f0bSLuiz Augusto von Dentz struct hci_conn_hash *h = &hdev->conn_hash; 369302b20f0bSLuiz Augusto von Dentz struct hci_conn *conn; 369402b20f0bSLuiz Augusto von Dentz int num = 0; 369502b20f0bSLuiz Augusto von Dentz 369602b20f0bSLuiz Augusto von Dentz BT_DBG("%s", hdev->name); 369702b20f0bSLuiz Augusto von Dentz 3698bf4c6325SGustavo F. Padovan rcu_read_lock(); 3699bf4c6325SGustavo F. Padovan 3700bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(conn, &h->list, list) { 370102b20f0bSLuiz Augusto von Dentz struct hci_chan *chan; 370202b20f0bSLuiz Augusto von Dentz 370302b20f0bSLuiz Augusto von Dentz if (conn->type != type) 370402b20f0bSLuiz Augusto von Dentz continue; 370502b20f0bSLuiz Augusto von Dentz 370602b20f0bSLuiz Augusto von Dentz if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG) 370702b20f0bSLuiz Augusto von Dentz continue; 370802b20f0bSLuiz Augusto von Dentz 370902b20f0bSLuiz Augusto von Dentz num++; 371002b20f0bSLuiz Augusto von Dentz 37118192edefSGustavo F. Padovan list_for_each_entry_rcu(chan, &conn->chan_list, list) { 371202b20f0bSLuiz Augusto von Dentz struct sk_buff *skb; 371302b20f0bSLuiz Augusto von Dentz 371402b20f0bSLuiz Augusto von Dentz if (chan->sent) { 371502b20f0bSLuiz Augusto von Dentz chan->sent = 0; 371602b20f0bSLuiz Augusto von Dentz continue; 371702b20f0bSLuiz Augusto von Dentz } 371802b20f0bSLuiz Augusto von Dentz 371902b20f0bSLuiz Augusto von Dentz if (skb_queue_empty(&chan->data_q)) 372002b20f0bSLuiz Augusto von Dentz continue; 372102b20f0bSLuiz Augusto von Dentz 372202b20f0bSLuiz Augusto von Dentz skb = skb_peek(&chan->data_q); 372302b20f0bSLuiz Augusto von Dentz if (skb->priority >= HCI_PRIO_MAX - 1) 372402b20f0bSLuiz Augusto von Dentz continue; 372502b20f0bSLuiz Augusto von Dentz 372602b20f0bSLuiz Augusto von Dentz skb->priority = HCI_PRIO_MAX - 1; 372702b20f0bSLuiz Augusto von Dentz 372802b20f0bSLuiz Augusto von Dentz BT_DBG("chan %p skb %p promoted to %d", chan, skb, 372902b20f0bSLuiz Augusto von Dentz skb->priority); 373002b20f0bSLuiz Augusto von Dentz } 373102b20f0bSLuiz Augusto von Dentz 373202b20f0bSLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == num) 373302b20f0bSLuiz Augusto von Dentz break; 373402b20f0bSLuiz Augusto von Dentz } 3735bf4c6325SGustavo F. Padovan 3736bf4c6325SGustavo F. Padovan rcu_read_unlock(); 3737bf4c6325SGustavo F. Padovan 373802b20f0bSLuiz Augusto von Dentz } 373902b20f0bSLuiz Augusto von Dentz 3740b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb) 3741b71d385aSAndrei Emeltchenko { 3742b71d385aSAndrei Emeltchenko /* Calculate count of blocks used by this packet */ 3743b71d385aSAndrei Emeltchenko return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len); 3744b71d385aSAndrei Emeltchenko } 3745b71d385aSAndrei Emeltchenko 37466039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt) 37471da177e4SLinus Torvalds { 3748d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 37491da177e4SLinus Torvalds /* ACL tx timeout must be longer than maximum 37501da177e4SLinus Torvalds * link supervision timeout (40.9 seconds) */ 375163d2bc1bSAndrei Emeltchenko if (!cnt && time_after(jiffies, hdev->acl_last_tx + 37525f246e89SAndrei Emeltchenko HCI_ACL_TX_TIMEOUT)) 3753bae1f5d9SVille Tervo hci_link_tx_to(hdev, ACL_LINK); 37541da177e4SLinus Torvalds } 375563d2bc1bSAndrei Emeltchenko } 37561da177e4SLinus Torvalds 37576039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev) 375863d2bc1bSAndrei Emeltchenko { 375963d2bc1bSAndrei Emeltchenko unsigned int cnt = hdev->acl_cnt; 376063d2bc1bSAndrei Emeltchenko struct hci_chan *chan; 376163d2bc1bSAndrei Emeltchenko struct sk_buff *skb; 376263d2bc1bSAndrei Emeltchenko int quote; 376363d2bc1bSAndrei Emeltchenko 376463d2bc1bSAndrei Emeltchenko __check_timeout(hdev, cnt); 376504837f64SMarcel Holtmann 376673d80debSLuiz Augusto von Dentz while (hdev->acl_cnt && 376773d80debSLuiz Augusto von Dentz (chan = hci_chan_sent(hdev, ACL_LINK, "e))) { 3768ec1cce24SLuiz Augusto von Dentz u32 priority = (skb_peek(&chan->data_q))->priority; 3769ec1cce24SLuiz Augusto von Dentz while (quote-- && (skb = skb_peek(&chan->data_q))) { 377073d80debSLuiz Augusto von Dentz BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 377173d80debSLuiz Augusto von Dentz skb->len, skb->priority); 377273d80debSLuiz Augusto von Dentz 3773ec1cce24SLuiz Augusto von Dentz /* Stop if priority has changed */ 3774ec1cce24SLuiz Augusto von Dentz if (skb->priority < priority) 3775ec1cce24SLuiz Augusto von Dentz break; 3776ec1cce24SLuiz Augusto von Dentz 3777ec1cce24SLuiz Augusto von Dentz skb = skb_dequeue(&chan->data_q); 3778ec1cce24SLuiz Augusto von Dentz 377973d80debSLuiz Augusto von Dentz hci_conn_enter_active_mode(chan->conn, 378073d80debSLuiz Augusto von Dentz bt_cb(skb)->force_active); 378104837f64SMarcel Holtmann 378257d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 37831da177e4SLinus Torvalds hdev->acl_last_tx = jiffies; 37841da177e4SLinus Torvalds 37851da177e4SLinus Torvalds hdev->acl_cnt--; 378673d80debSLuiz Augusto von Dentz chan->sent++; 378773d80debSLuiz Augusto von Dentz chan->conn->sent++; 37881da177e4SLinus Torvalds } 37891da177e4SLinus Torvalds } 379002b20f0bSLuiz Augusto von Dentz 379102b20f0bSLuiz Augusto von Dentz if (cnt != hdev->acl_cnt) 379202b20f0bSLuiz Augusto von Dentz hci_prio_recalculate(hdev, ACL_LINK); 37931da177e4SLinus Torvalds } 37941da177e4SLinus Torvalds 37956039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev) 3796b71d385aSAndrei Emeltchenko { 379763d2bc1bSAndrei Emeltchenko unsigned int cnt = hdev->block_cnt; 3798b71d385aSAndrei Emeltchenko struct hci_chan *chan; 3799b71d385aSAndrei Emeltchenko struct sk_buff *skb; 3800b71d385aSAndrei Emeltchenko int quote; 3801bd1eb66bSAndrei Emeltchenko u8 type; 3802b71d385aSAndrei Emeltchenko 380363d2bc1bSAndrei Emeltchenko __check_timeout(hdev, cnt); 3804b71d385aSAndrei Emeltchenko 3805bd1eb66bSAndrei Emeltchenko BT_DBG("%s", hdev->name); 3806bd1eb66bSAndrei Emeltchenko 3807bd1eb66bSAndrei Emeltchenko if (hdev->dev_type == HCI_AMP) 3808bd1eb66bSAndrei Emeltchenko type = AMP_LINK; 3809bd1eb66bSAndrei Emeltchenko else 3810bd1eb66bSAndrei Emeltchenko type = ACL_LINK; 3811bd1eb66bSAndrei Emeltchenko 3812b71d385aSAndrei Emeltchenko while (hdev->block_cnt > 0 && 3813bd1eb66bSAndrei Emeltchenko (chan = hci_chan_sent(hdev, type, "e))) { 3814b71d385aSAndrei Emeltchenko u32 priority = (skb_peek(&chan->data_q))->priority; 3815b71d385aSAndrei Emeltchenko while (quote > 0 && (skb = skb_peek(&chan->data_q))) { 3816b71d385aSAndrei Emeltchenko int blocks; 3817b71d385aSAndrei Emeltchenko 3818b71d385aSAndrei Emeltchenko BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 3819b71d385aSAndrei Emeltchenko skb->len, skb->priority); 3820b71d385aSAndrei Emeltchenko 3821b71d385aSAndrei Emeltchenko /* Stop if priority has changed */ 3822b71d385aSAndrei Emeltchenko if (skb->priority < priority) 3823b71d385aSAndrei Emeltchenko break; 3824b71d385aSAndrei Emeltchenko 3825b71d385aSAndrei Emeltchenko skb = skb_dequeue(&chan->data_q); 3826b71d385aSAndrei Emeltchenko 3827b71d385aSAndrei Emeltchenko blocks = __get_blocks(hdev, skb); 3828b71d385aSAndrei Emeltchenko if (blocks > hdev->block_cnt) 3829b71d385aSAndrei Emeltchenko return; 3830b71d385aSAndrei Emeltchenko 3831b71d385aSAndrei Emeltchenko hci_conn_enter_active_mode(chan->conn, 3832b71d385aSAndrei Emeltchenko bt_cb(skb)->force_active); 3833b71d385aSAndrei Emeltchenko 383457d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 3835b71d385aSAndrei Emeltchenko hdev->acl_last_tx = jiffies; 3836b71d385aSAndrei Emeltchenko 3837b71d385aSAndrei Emeltchenko hdev->block_cnt -= blocks; 3838b71d385aSAndrei Emeltchenko quote -= blocks; 3839b71d385aSAndrei Emeltchenko 3840b71d385aSAndrei Emeltchenko chan->sent += blocks; 3841b71d385aSAndrei Emeltchenko chan->conn->sent += blocks; 3842b71d385aSAndrei Emeltchenko } 3843b71d385aSAndrei Emeltchenko } 3844b71d385aSAndrei Emeltchenko 3845b71d385aSAndrei Emeltchenko if (cnt != hdev->block_cnt) 3846bd1eb66bSAndrei Emeltchenko hci_prio_recalculate(hdev, type); 3847b71d385aSAndrei Emeltchenko } 3848b71d385aSAndrei Emeltchenko 38496039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev) 3850b71d385aSAndrei Emeltchenko { 3851b71d385aSAndrei Emeltchenko BT_DBG("%s", hdev->name); 3852b71d385aSAndrei Emeltchenko 3853bd1eb66bSAndrei Emeltchenko /* No ACL link over BR/EDR controller */ 3854bd1eb66bSAndrei Emeltchenko if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR) 3855bd1eb66bSAndrei Emeltchenko return; 3856bd1eb66bSAndrei Emeltchenko 3857bd1eb66bSAndrei Emeltchenko /* No AMP link over AMP controller */ 3858bd1eb66bSAndrei Emeltchenko if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP) 3859b71d385aSAndrei Emeltchenko return; 3860b71d385aSAndrei Emeltchenko 3861b71d385aSAndrei Emeltchenko switch (hdev->flow_ctl_mode) { 3862b71d385aSAndrei Emeltchenko case HCI_FLOW_CTL_MODE_PACKET_BASED: 3863b71d385aSAndrei Emeltchenko hci_sched_acl_pkt(hdev); 3864b71d385aSAndrei Emeltchenko break; 3865b71d385aSAndrei Emeltchenko 3866b71d385aSAndrei Emeltchenko case HCI_FLOW_CTL_MODE_BLOCK_BASED: 3867b71d385aSAndrei Emeltchenko hci_sched_acl_blk(hdev); 3868b71d385aSAndrei Emeltchenko break; 3869b71d385aSAndrei Emeltchenko } 3870b71d385aSAndrei Emeltchenko } 3871b71d385aSAndrei Emeltchenko 38721da177e4SLinus Torvalds /* Schedule SCO */ 38736039aa73SGustavo Padovan static void hci_sched_sco(struct hci_dev *hdev) 38741da177e4SLinus Torvalds { 38751da177e4SLinus Torvalds struct hci_conn *conn; 38761da177e4SLinus Torvalds struct sk_buff *skb; 38771da177e4SLinus Torvalds int quote; 38781da177e4SLinus Torvalds 38791da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 38801da177e4SLinus Torvalds 388152087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, SCO_LINK)) 388252087a79SLuiz Augusto von Dentz return; 388352087a79SLuiz Augusto von Dentz 38841da177e4SLinus Torvalds while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, "e))) { 38851da177e4SLinus Torvalds while (quote-- && (skb = skb_dequeue(&conn->data_q))) { 38861da177e4SLinus Torvalds BT_DBG("skb %p len %d", skb, skb->len); 388757d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 38881da177e4SLinus Torvalds 38891da177e4SLinus Torvalds conn->sent++; 38901da177e4SLinus Torvalds if (conn->sent == ~0) 38911da177e4SLinus Torvalds conn->sent = 0; 38921da177e4SLinus Torvalds } 38931da177e4SLinus Torvalds } 38941da177e4SLinus Torvalds } 38951da177e4SLinus Torvalds 38966039aa73SGustavo Padovan static void hci_sched_esco(struct hci_dev *hdev) 3897b6a0dc82SMarcel Holtmann { 3898b6a0dc82SMarcel Holtmann struct hci_conn *conn; 3899b6a0dc82SMarcel Holtmann struct sk_buff *skb; 3900b6a0dc82SMarcel Holtmann int quote; 3901b6a0dc82SMarcel Holtmann 3902b6a0dc82SMarcel Holtmann BT_DBG("%s", hdev->name); 3903b6a0dc82SMarcel Holtmann 390452087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, ESCO_LINK)) 390552087a79SLuiz Augusto von Dentz return; 390652087a79SLuiz Augusto von Dentz 39078fc9ced3SGustavo Padovan while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK, 39088fc9ced3SGustavo Padovan "e))) { 3909b6a0dc82SMarcel Holtmann while (quote-- && (skb = skb_dequeue(&conn->data_q))) { 3910b6a0dc82SMarcel Holtmann BT_DBG("skb %p len %d", skb, skb->len); 391157d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 3912b6a0dc82SMarcel Holtmann 3913b6a0dc82SMarcel Holtmann conn->sent++; 3914b6a0dc82SMarcel Holtmann if (conn->sent == ~0) 3915b6a0dc82SMarcel Holtmann conn->sent = 0; 3916b6a0dc82SMarcel Holtmann } 3917b6a0dc82SMarcel Holtmann } 3918b6a0dc82SMarcel Holtmann } 3919b6a0dc82SMarcel Holtmann 39206039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev) 39216ed58ec5SVille Tervo { 392273d80debSLuiz Augusto von Dentz struct hci_chan *chan; 39236ed58ec5SVille Tervo struct sk_buff *skb; 392402b20f0bSLuiz Augusto von Dentz int quote, cnt, tmp; 39256ed58ec5SVille Tervo 39266ed58ec5SVille Tervo BT_DBG("%s", hdev->name); 39276ed58ec5SVille Tervo 392852087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, LE_LINK)) 392952087a79SLuiz Augusto von Dentz return; 393052087a79SLuiz Augusto von Dentz 3931d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 39326ed58ec5SVille Tervo /* LE tx timeout must be longer than maximum 39336ed58ec5SVille Tervo * link supervision timeout (40.9 seconds) */ 3934bae1f5d9SVille Tervo if (!hdev->le_cnt && hdev->le_pkts && 39356ed58ec5SVille Tervo time_after(jiffies, hdev->le_last_tx + HZ * 45)) 3936bae1f5d9SVille Tervo hci_link_tx_to(hdev, LE_LINK); 39376ed58ec5SVille Tervo } 39386ed58ec5SVille Tervo 39396ed58ec5SVille Tervo cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt; 394002b20f0bSLuiz Augusto von Dentz tmp = cnt; 394173d80debSLuiz Augusto von Dentz while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, "e))) { 3942ec1cce24SLuiz Augusto von Dentz u32 priority = (skb_peek(&chan->data_q))->priority; 3943ec1cce24SLuiz Augusto von Dentz while (quote-- && (skb = skb_peek(&chan->data_q))) { 394473d80debSLuiz Augusto von Dentz BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 394573d80debSLuiz Augusto von Dentz skb->len, skb->priority); 39466ed58ec5SVille Tervo 3947ec1cce24SLuiz Augusto von Dentz /* Stop if priority has changed */ 3948ec1cce24SLuiz Augusto von Dentz if (skb->priority < priority) 3949ec1cce24SLuiz Augusto von Dentz break; 3950ec1cce24SLuiz Augusto von Dentz 3951ec1cce24SLuiz Augusto von Dentz skb = skb_dequeue(&chan->data_q); 3952ec1cce24SLuiz Augusto von Dentz 395357d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 39546ed58ec5SVille Tervo hdev->le_last_tx = jiffies; 39556ed58ec5SVille Tervo 39566ed58ec5SVille Tervo cnt--; 395773d80debSLuiz Augusto von Dentz chan->sent++; 395873d80debSLuiz Augusto von Dentz chan->conn->sent++; 39596ed58ec5SVille Tervo } 39606ed58ec5SVille Tervo } 396173d80debSLuiz Augusto von Dentz 39626ed58ec5SVille Tervo if (hdev->le_pkts) 39636ed58ec5SVille Tervo hdev->le_cnt = cnt; 39646ed58ec5SVille Tervo else 39656ed58ec5SVille Tervo hdev->acl_cnt = cnt; 396602b20f0bSLuiz Augusto von Dentz 396702b20f0bSLuiz Augusto von Dentz if (cnt != tmp) 396802b20f0bSLuiz Augusto von Dentz hci_prio_recalculate(hdev, LE_LINK); 39696ed58ec5SVille Tervo } 39706ed58ec5SVille Tervo 39713eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work) 39721da177e4SLinus Torvalds { 39733eff45eaSGustavo F. Padovan struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work); 39741da177e4SLinus Torvalds struct sk_buff *skb; 39751da177e4SLinus Torvalds 39766ed58ec5SVille Tervo BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt, 39776ed58ec5SVille Tervo hdev->sco_cnt, hdev->le_cnt); 39781da177e4SLinus Torvalds 3979d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 39801da177e4SLinus Torvalds /* Schedule queues and send stuff to HCI driver */ 39811da177e4SLinus Torvalds hci_sched_acl(hdev); 39821da177e4SLinus Torvalds hci_sched_sco(hdev); 3983b6a0dc82SMarcel Holtmann hci_sched_esco(hdev); 39846ed58ec5SVille Tervo hci_sched_le(hdev); 398552de599eSMarcel Holtmann } 39866ed58ec5SVille Tervo 39871da177e4SLinus Torvalds /* Send next queued raw (unknown type) packet */ 39881da177e4SLinus Torvalds while ((skb = skb_dequeue(&hdev->raw_q))) 398957d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 39901da177e4SLinus Torvalds } 39911da177e4SLinus Torvalds 399225985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */ 39931da177e4SLinus Torvalds 39941da177e4SLinus Torvalds /* ACL data packet */ 39956039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) 39961da177e4SLinus Torvalds { 39971da177e4SLinus Torvalds struct hci_acl_hdr *hdr = (void *) skb->data; 39981da177e4SLinus Torvalds struct hci_conn *conn; 39991da177e4SLinus Torvalds __u16 handle, flags; 40001da177e4SLinus Torvalds 40011da177e4SLinus Torvalds skb_pull(skb, HCI_ACL_HDR_SIZE); 40021da177e4SLinus Torvalds 40031da177e4SLinus Torvalds handle = __le16_to_cpu(hdr->handle); 40041da177e4SLinus Torvalds flags = hci_flags(handle); 40051da177e4SLinus Torvalds handle = hci_handle(handle); 40061da177e4SLinus Torvalds 4007f0e09510SAndrei Emeltchenko BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len, 4008a8c5fb1aSGustavo Padovan handle, flags); 40091da177e4SLinus Torvalds 40101da177e4SLinus Torvalds hdev->stat.acl_rx++; 40111da177e4SLinus Torvalds 40121da177e4SLinus Torvalds hci_dev_lock(hdev); 40131da177e4SLinus Torvalds conn = hci_conn_hash_lookup_handle(hdev, handle); 40141da177e4SLinus Torvalds hci_dev_unlock(hdev); 40151da177e4SLinus Torvalds 40161da177e4SLinus Torvalds if (conn) { 401765983fc7SMat Martineau hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); 401804837f64SMarcel Holtmann 40191da177e4SLinus Torvalds /* Send to upper protocol */ 4020686ebf28SUlisses Furquim l2cap_recv_acldata(conn, skb, flags); 40211da177e4SLinus Torvalds return; 40221da177e4SLinus Torvalds } else { 40231da177e4SLinus Torvalds BT_ERR("%s ACL packet for unknown connection handle %d", 40241da177e4SLinus Torvalds hdev->name, handle); 40251da177e4SLinus Torvalds } 40261da177e4SLinus Torvalds 40271da177e4SLinus Torvalds kfree_skb(skb); 40281da177e4SLinus Torvalds } 40291da177e4SLinus Torvalds 40301da177e4SLinus Torvalds /* SCO data packet */ 40316039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb) 40321da177e4SLinus Torvalds { 40331da177e4SLinus Torvalds struct hci_sco_hdr *hdr = (void *) skb->data; 40341da177e4SLinus Torvalds struct hci_conn *conn; 40351da177e4SLinus Torvalds __u16 handle; 40361da177e4SLinus Torvalds 40371da177e4SLinus Torvalds skb_pull(skb, HCI_SCO_HDR_SIZE); 40381da177e4SLinus Torvalds 40391da177e4SLinus Torvalds handle = __le16_to_cpu(hdr->handle); 40401da177e4SLinus Torvalds 4041f0e09510SAndrei Emeltchenko BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle); 40421da177e4SLinus Torvalds 40431da177e4SLinus Torvalds hdev->stat.sco_rx++; 40441da177e4SLinus Torvalds 40451da177e4SLinus Torvalds hci_dev_lock(hdev); 40461da177e4SLinus Torvalds conn = hci_conn_hash_lookup_handle(hdev, handle); 40471da177e4SLinus Torvalds hci_dev_unlock(hdev); 40481da177e4SLinus Torvalds 40491da177e4SLinus Torvalds if (conn) { 40501da177e4SLinus Torvalds /* Send to upper protocol */ 4051686ebf28SUlisses Furquim sco_recv_scodata(conn, skb); 40521da177e4SLinus Torvalds return; 40531da177e4SLinus Torvalds } else { 40541da177e4SLinus Torvalds BT_ERR("%s SCO packet for unknown connection handle %d", 40551da177e4SLinus Torvalds hdev->name, handle); 40561da177e4SLinus Torvalds } 40571da177e4SLinus Torvalds 40581da177e4SLinus Torvalds kfree_skb(skb); 40591da177e4SLinus Torvalds } 40601da177e4SLinus Torvalds 40619238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev) 40629238f36aSJohan Hedberg { 40639238f36aSJohan Hedberg struct sk_buff *skb; 40649238f36aSJohan Hedberg 40659238f36aSJohan Hedberg skb = skb_peek(&hdev->cmd_q); 40669238f36aSJohan Hedberg if (!skb) 40679238f36aSJohan Hedberg return true; 40689238f36aSJohan Hedberg 4069db6e3e8dSJohan Hedberg return bt_cb(skb)->req.start; 40709238f36aSJohan Hedberg } 40719238f36aSJohan Hedberg 407242c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev) 407342c6b129SJohan Hedberg { 407442c6b129SJohan Hedberg struct hci_command_hdr *sent; 407542c6b129SJohan Hedberg struct sk_buff *skb; 407642c6b129SJohan Hedberg u16 opcode; 407742c6b129SJohan Hedberg 407842c6b129SJohan Hedberg if (!hdev->sent_cmd) 407942c6b129SJohan Hedberg return; 408042c6b129SJohan Hedberg 408142c6b129SJohan Hedberg sent = (void *) hdev->sent_cmd->data; 408242c6b129SJohan Hedberg opcode = __le16_to_cpu(sent->opcode); 408342c6b129SJohan Hedberg if (opcode == HCI_OP_RESET) 408442c6b129SJohan Hedberg return; 408542c6b129SJohan Hedberg 408642c6b129SJohan Hedberg skb = skb_clone(hdev->sent_cmd, GFP_KERNEL); 408742c6b129SJohan Hedberg if (!skb) 408842c6b129SJohan Hedberg return; 408942c6b129SJohan Hedberg 409042c6b129SJohan Hedberg skb_queue_head(&hdev->cmd_q, skb); 409142c6b129SJohan Hedberg queue_work(hdev->workqueue, &hdev->cmd_work); 409242c6b129SJohan Hedberg } 409342c6b129SJohan Hedberg 4094e6214487SJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status, 4095e6214487SJohan Hedberg hci_req_complete_t *req_complete, 4096e6214487SJohan Hedberg hci_req_complete_skb_t *req_complete_skb) 40979238f36aSJohan Hedberg { 40989238f36aSJohan Hedberg struct sk_buff *skb; 40999238f36aSJohan Hedberg unsigned long flags; 41009238f36aSJohan Hedberg 41019238f36aSJohan Hedberg BT_DBG("opcode 0x%04x status 0x%02x", opcode, status); 41029238f36aSJohan Hedberg 410342c6b129SJohan Hedberg /* If the completed command doesn't match the last one that was 410442c6b129SJohan Hedberg * sent we need to do special handling of it. 41059238f36aSJohan Hedberg */ 410642c6b129SJohan Hedberg if (!hci_sent_cmd_data(hdev, opcode)) { 410742c6b129SJohan Hedberg /* Some CSR based controllers generate a spontaneous 410842c6b129SJohan Hedberg * reset complete event during init and any pending 410942c6b129SJohan Hedberg * command will never be completed. In such a case we 411042c6b129SJohan Hedberg * need to resend whatever was the last sent 411142c6b129SJohan Hedberg * command. 411242c6b129SJohan Hedberg */ 411342c6b129SJohan Hedberg if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET) 411442c6b129SJohan Hedberg hci_resend_last(hdev); 411542c6b129SJohan Hedberg 41169238f36aSJohan Hedberg return; 411742c6b129SJohan Hedberg } 41189238f36aSJohan Hedberg 41199238f36aSJohan Hedberg /* If the command succeeded and there's still more commands in 41209238f36aSJohan Hedberg * this request the request is not yet complete. 41219238f36aSJohan Hedberg */ 41229238f36aSJohan Hedberg if (!status && !hci_req_is_complete(hdev)) 41239238f36aSJohan Hedberg return; 41249238f36aSJohan Hedberg 41259238f36aSJohan Hedberg /* If this was the last command in a request the complete 41269238f36aSJohan Hedberg * callback would be found in hdev->sent_cmd instead of the 41279238f36aSJohan Hedberg * command queue (hdev->cmd_q). 41289238f36aSJohan Hedberg */ 4129e6214487SJohan Hedberg if (bt_cb(hdev->sent_cmd)->req.complete) { 4130e6214487SJohan Hedberg *req_complete = bt_cb(hdev->sent_cmd)->req.complete; 4131e6214487SJohan Hedberg return; 41329238f36aSJohan Hedberg } 4133e6214487SJohan Hedberg 4134e6214487SJohan Hedberg if (bt_cb(hdev->sent_cmd)->req.complete_skb) { 4135e6214487SJohan Hedberg *req_complete_skb = bt_cb(hdev->sent_cmd)->req.complete_skb; 4136e6214487SJohan Hedberg return; 413753e21fbcSJohan Hedberg } 41389238f36aSJohan Hedberg 41399238f36aSJohan Hedberg /* Remove all pending commands belonging to this request */ 41409238f36aSJohan Hedberg spin_lock_irqsave(&hdev->cmd_q.lock, flags); 41419238f36aSJohan Hedberg while ((skb = __skb_dequeue(&hdev->cmd_q))) { 4142db6e3e8dSJohan Hedberg if (bt_cb(skb)->req.start) { 41439238f36aSJohan Hedberg __skb_queue_head(&hdev->cmd_q, skb); 41449238f36aSJohan Hedberg break; 41459238f36aSJohan Hedberg } 41469238f36aSJohan Hedberg 4147e6214487SJohan Hedberg *req_complete = bt_cb(skb)->req.complete; 4148e6214487SJohan Hedberg *req_complete_skb = bt_cb(skb)->req.complete_skb; 41499238f36aSJohan Hedberg kfree_skb(skb); 41509238f36aSJohan Hedberg } 41519238f36aSJohan Hedberg spin_unlock_irqrestore(&hdev->cmd_q.lock, flags); 41529238f36aSJohan Hedberg } 41539238f36aSJohan Hedberg 4154b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work) 41551da177e4SLinus Torvalds { 4156b78752ccSMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work); 41571da177e4SLinus Torvalds struct sk_buff *skb; 41581da177e4SLinus Torvalds 41591da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 41601da177e4SLinus Torvalds 41611da177e4SLinus Torvalds while ((skb = skb_dequeue(&hdev->rx_q))) { 4162cd82e61cSMarcel Holtmann /* Send copy to monitor */ 4163cd82e61cSMarcel Holtmann hci_send_to_monitor(hdev, skb); 4164cd82e61cSMarcel Holtmann 41651da177e4SLinus Torvalds if (atomic_read(&hdev->promisc)) { 41661da177e4SLinus Torvalds /* Send copy to the sockets */ 4167470fe1b5SMarcel Holtmann hci_send_to_sock(hdev, skb); 41681da177e4SLinus Torvalds } 41691da177e4SLinus Torvalds 4170d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 41711da177e4SLinus Torvalds kfree_skb(skb); 41721da177e4SLinus Torvalds continue; 41731da177e4SLinus Torvalds } 41741da177e4SLinus Torvalds 41751da177e4SLinus Torvalds if (test_bit(HCI_INIT, &hdev->flags)) { 41761da177e4SLinus Torvalds /* Don't process data packets in this states. */ 41770d48d939SMarcel Holtmann switch (bt_cb(skb)->pkt_type) { 41781da177e4SLinus Torvalds case HCI_ACLDATA_PKT: 41791da177e4SLinus Torvalds case HCI_SCODATA_PKT: 41801da177e4SLinus Torvalds kfree_skb(skb); 41811da177e4SLinus Torvalds continue; 41823ff50b79SStephen Hemminger } 41831da177e4SLinus Torvalds } 41841da177e4SLinus Torvalds 41851da177e4SLinus Torvalds /* Process frame */ 41860d48d939SMarcel Holtmann switch (bt_cb(skb)->pkt_type) { 41871da177e4SLinus Torvalds case HCI_EVENT_PKT: 4188b78752ccSMarcel Holtmann BT_DBG("%s Event packet", hdev->name); 41891da177e4SLinus Torvalds hci_event_packet(hdev, skb); 41901da177e4SLinus Torvalds break; 41911da177e4SLinus Torvalds 41921da177e4SLinus Torvalds case HCI_ACLDATA_PKT: 41931da177e4SLinus Torvalds BT_DBG("%s ACL data packet", hdev->name); 41941da177e4SLinus Torvalds hci_acldata_packet(hdev, skb); 41951da177e4SLinus Torvalds break; 41961da177e4SLinus Torvalds 41971da177e4SLinus Torvalds case HCI_SCODATA_PKT: 41981da177e4SLinus Torvalds BT_DBG("%s SCO data packet", hdev->name); 41991da177e4SLinus Torvalds hci_scodata_packet(hdev, skb); 42001da177e4SLinus Torvalds break; 42011da177e4SLinus Torvalds 42021da177e4SLinus Torvalds default: 42031da177e4SLinus Torvalds kfree_skb(skb); 42041da177e4SLinus Torvalds break; 42051da177e4SLinus Torvalds } 42061da177e4SLinus Torvalds } 42071da177e4SLinus Torvalds } 42081da177e4SLinus Torvalds 4209c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work) 42101da177e4SLinus Torvalds { 4211c347b765SGustavo F. Padovan struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work); 42121da177e4SLinus Torvalds struct sk_buff *skb; 42131da177e4SLinus Torvalds 42142104786bSAndrei Emeltchenko BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name, 42152104786bSAndrei Emeltchenko atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q)); 42161da177e4SLinus Torvalds 42171da177e4SLinus Torvalds /* Send queued commands */ 42185a08ecceSAndrei Emeltchenko if (atomic_read(&hdev->cmd_cnt)) { 42195a08ecceSAndrei Emeltchenko skb = skb_dequeue(&hdev->cmd_q); 42205a08ecceSAndrei Emeltchenko if (!skb) 42215a08ecceSAndrei Emeltchenko return; 42225a08ecceSAndrei Emeltchenko 42231da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 42241da177e4SLinus Torvalds 4225a675d7f1SMarcel Holtmann hdev->sent_cmd = skb_clone(skb, GFP_KERNEL); 422670f23020SAndrei Emeltchenko if (hdev->sent_cmd) { 42271da177e4SLinus Torvalds atomic_dec(&hdev->cmd_cnt); 422857d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 42297bdb8a5cSSzymon Janc if (test_bit(HCI_RESET, &hdev->flags)) 423065cc2b49SMarcel Holtmann cancel_delayed_work(&hdev->cmd_timer); 42317bdb8a5cSSzymon Janc else 423265cc2b49SMarcel Holtmann schedule_delayed_work(&hdev->cmd_timer, 423365cc2b49SMarcel Holtmann HCI_CMD_TIMEOUT); 42341da177e4SLinus Torvalds } else { 42351da177e4SLinus Torvalds skb_queue_head(&hdev->cmd_q, skb); 4236c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 42371da177e4SLinus Torvalds } 42381da177e4SLinus Torvalds } 42391da177e4SLinus Torvalds } 4240