11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds BlueZ - Bluetooth protocol stack for Linux 31da177e4SLinus Torvalds Copyright (C) 2000-2001 Qualcomm Incorporated 4590051deSGustavo F. Padovan Copyright (C) 2011 ProFUSION Embedded Systems 51da177e4SLinus Torvalds 61da177e4SLinus Torvalds Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds This program is free software; you can redistribute it and/or modify 91da177e4SLinus Torvalds it under the terms of the GNU General Public License version 2 as 101da177e4SLinus Torvalds published by the Free Software Foundation; 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 131da177e4SLinus Torvalds OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 141da177e4SLinus Torvalds FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 151da177e4SLinus Torvalds IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY 161da177e4SLinus Torvalds CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 171da177e4SLinus Torvalds WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 181da177e4SLinus Torvalds ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 191da177e4SLinus Torvalds OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 221da177e4SLinus Torvalds COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 231da177e4SLinus Torvalds SOFTWARE IS DISCLAIMED. 241da177e4SLinus Torvalds */ 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds /* Bluetooth HCI core. */ 271da177e4SLinus Torvalds 288c520a59SGustavo Padovan #include <linux/export.h> 293df92b31SSasha Levin #include <linux/idr.h> 30611b30f7SMarcel Holtmann #include <linux/rfkill.h> 31baf27f6eSMarcel Holtmann #include <linux/debugfs.h> 3299780a7bSJohan Hedberg #include <linux/crypto.h> 3347219839SMarcel Holtmann #include <asm/unaligned.h> 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds #include <net/bluetooth/bluetooth.h> 361da177e4SLinus Torvalds #include <net/bluetooth/hci_core.h> 374bc58f51SJohan Hedberg #include <net/bluetooth/l2cap.h> 38af58925cSMarcel Holtmann #include <net/bluetooth/mgmt.h> 391da177e4SLinus Torvalds 400857dd3bSJohan Hedberg #include "hci_request.h" 4160c5f5fbSMarcel Holtmann #include "hci_debugfs.h" 42970c4e46SJohan Hedberg #include "smp.h" 43970c4e46SJohan Hedberg 44b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work); 45c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work); 463eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work); 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds /* HCI device list */ 491da177e4SLinus Torvalds LIST_HEAD(hci_dev_list); 501da177e4SLinus Torvalds DEFINE_RWLOCK(hci_dev_list_lock); 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds /* HCI callback list */ 531da177e4SLinus Torvalds LIST_HEAD(hci_cb_list); 54fba7ecf0SJohan Hedberg DEFINE_MUTEX(hci_cb_list_lock); 551da177e4SLinus Torvalds 563df92b31SSasha Levin /* HCI ID Numbering */ 573df92b31SSasha Levin static DEFINE_IDA(hci_index_ida); 583df92b31SSasha Levin 59899de765SMarcel Holtmann /* ----- HCI requests ----- */ 60899de765SMarcel Holtmann 61899de765SMarcel Holtmann #define HCI_REQ_DONE 0 62899de765SMarcel Holtmann #define HCI_REQ_PEND 1 63899de765SMarcel Holtmann #define HCI_REQ_CANCELED 2 64899de765SMarcel Holtmann 65899de765SMarcel Holtmann #define hci_req_lock(d) mutex_lock(&d->req_lock) 66899de765SMarcel Holtmann #define hci_req_unlock(d) mutex_unlock(&d->req_lock) 67899de765SMarcel Holtmann 681da177e4SLinus Torvalds /* ---- HCI notifications ---- */ 691da177e4SLinus Torvalds 706516455dSMarcel Holtmann static void hci_notify(struct hci_dev *hdev, int event) 711da177e4SLinus Torvalds { 72040030efSMarcel Holtmann hci_sock_dev_event(hdev, event); 731da177e4SLinus Torvalds } 741da177e4SLinus Torvalds 75baf27f6eSMarcel Holtmann /* ---- HCI debugfs entries ---- */ 76baf27f6eSMarcel Holtmann 774b4148e9SMarcel Holtmann static ssize_t dut_mode_read(struct file *file, char __user *user_buf, 784b4148e9SMarcel Holtmann size_t count, loff_t *ppos) 794b4148e9SMarcel Holtmann { 804b4148e9SMarcel Holtmann struct hci_dev *hdev = file->private_data; 814b4148e9SMarcel Holtmann char buf[3]; 824b4148e9SMarcel Holtmann 83b7cb93e5SMarcel Holtmann buf[0] = hci_dev_test_flag(hdev, HCI_DUT_MODE) ? 'Y': 'N'; 844b4148e9SMarcel Holtmann buf[1] = '\n'; 854b4148e9SMarcel Holtmann buf[2] = '\0'; 864b4148e9SMarcel Holtmann return simple_read_from_buffer(user_buf, count, ppos, buf, 2); 874b4148e9SMarcel Holtmann } 884b4148e9SMarcel Holtmann 894b4148e9SMarcel Holtmann static ssize_t dut_mode_write(struct file *file, const char __user *user_buf, 904b4148e9SMarcel Holtmann size_t count, loff_t *ppos) 914b4148e9SMarcel Holtmann { 924b4148e9SMarcel Holtmann struct hci_dev *hdev = file->private_data; 934b4148e9SMarcel Holtmann struct sk_buff *skb; 944b4148e9SMarcel Holtmann char buf[32]; 954b4148e9SMarcel Holtmann size_t buf_size = min(count, (sizeof(buf)-1)); 964b4148e9SMarcel Holtmann bool enable; 974b4148e9SMarcel Holtmann 984b4148e9SMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) 994b4148e9SMarcel Holtmann return -ENETDOWN; 1004b4148e9SMarcel Holtmann 1014b4148e9SMarcel Holtmann if (copy_from_user(buf, user_buf, buf_size)) 1024b4148e9SMarcel Holtmann return -EFAULT; 1034b4148e9SMarcel Holtmann 1044b4148e9SMarcel Holtmann buf[buf_size] = '\0'; 1054b4148e9SMarcel Holtmann if (strtobool(buf, &enable)) 1064b4148e9SMarcel Holtmann return -EINVAL; 1074b4148e9SMarcel Holtmann 108b7cb93e5SMarcel Holtmann if (enable == hci_dev_test_flag(hdev, HCI_DUT_MODE)) 1094b4148e9SMarcel Holtmann return -EALREADY; 1104b4148e9SMarcel Holtmann 1114b4148e9SMarcel Holtmann hci_req_lock(hdev); 1124b4148e9SMarcel Holtmann if (enable) 1134b4148e9SMarcel Holtmann skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL, 1144b4148e9SMarcel Holtmann HCI_CMD_TIMEOUT); 1154b4148e9SMarcel Holtmann else 1164b4148e9SMarcel Holtmann skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, 1174b4148e9SMarcel Holtmann HCI_CMD_TIMEOUT); 1184b4148e9SMarcel Holtmann hci_req_unlock(hdev); 1194b4148e9SMarcel Holtmann 1204b4148e9SMarcel Holtmann if (IS_ERR(skb)) 1214b4148e9SMarcel Holtmann return PTR_ERR(skb); 1224b4148e9SMarcel Holtmann 1234b4148e9SMarcel Holtmann kfree_skb(skb); 1244b4148e9SMarcel Holtmann 125b7cb93e5SMarcel Holtmann hci_dev_change_flag(hdev, HCI_DUT_MODE); 1264b4148e9SMarcel Holtmann 1274b4148e9SMarcel Holtmann return count; 1284b4148e9SMarcel Holtmann } 1294b4148e9SMarcel Holtmann 1304b4148e9SMarcel Holtmann static const struct file_operations dut_mode_fops = { 1314b4148e9SMarcel Holtmann .open = simple_open, 1324b4148e9SMarcel Holtmann .read = dut_mode_read, 1334b4148e9SMarcel Holtmann .write = dut_mode_write, 1344b4148e9SMarcel Holtmann .llseek = default_llseek, 1354b4148e9SMarcel Holtmann }; 1364b4148e9SMarcel Holtmann 1371da177e4SLinus Torvalds /* ---- HCI requests ---- */ 1381da177e4SLinus Torvalds 139f60cb305SJohan Hedberg static void hci_req_sync_complete(struct hci_dev *hdev, u8 result, u16 opcode, 140f60cb305SJohan Hedberg struct sk_buff *skb) 1411da177e4SLinus Torvalds { 14242c6b129SJohan Hedberg BT_DBG("%s result 0x%2.2x", hdev->name, result); 14375fb0e32SJohan Hedberg 1441da177e4SLinus Torvalds if (hdev->req_status == HCI_REQ_PEND) { 1451da177e4SLinus Torvalds hdev->req_result = result; 1461da177e4SLinus Torvalds hdev->req_status = HCI_REQ_DONE; 147f60cb305SJohan Hedberg if (skb) 148f60cb305SJohan Hedberg hdev->req_skb = skb_get(skb); 1491da177e4SLinus Torvalds wake_up_interruptible(&hdev->req_wait_q); 1501da177e4SLinus Torvalds } 1511da177e4SLinus Torvalds } 1521da177e4SLinus Torvalds 1531da177e4SLinus Torvalds static void hci_req_cancel(struct hci_dev *hdev, int err) 1541da177e4SLinus Torvalds { 1551da177e4SLinus Torvalds BT_DBG("%s err 0x%2.2x", hdev->name, err); 1561da177e4SLinus Torvalds 1571da177e4SLinus Torvalds if (hdev->req_status == HCI_REQ_PEND) { 1581da177e4SLinus Torvalds hdev->req_result = err; 1591da177e4SLinus Torvalds hdev->req_status = HCI_REQ_CANCELED; 1601da177e4SLinus Torvalds wake_up_interruptible(&hdev->req_wait_q); 1611da177e4SLinus Torvalds } 1621da177e4SLinus Torvalds } 1631da177e4SLinus Torvalds 1647b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, 16507dc93ddSJohan Hedberg const void *param, u8 event, u32 timeout) 16675e84b7cSJohan Hedberg { 16775e84b7cSJohan Hedberg DECLARE_WAITQUEUE(wait, current); 16875e84b7cSJohan Hedberg struct hci_request req; 169f60cb305SJohan Hedberg struct sk_buff *skb; 17075e84b7cSJohan Hedberg int err = 0; 17175e84b7cSJohan Hedberg 17275e84b7cSJohan Hedberg BT_DBG("%s", hdev->name); 17375e84b7cSJohan Hedberg 17475e84b7cSJohan Hedberg hci_req_init(&req, hdev); 17575e84b7cSJohan Hedberg 1767b1abbbeSJohan Hedberg hci_req_add_ev(&req, opcode, plen, param, event); 17775e84b7cSJohan Hedberg 17875e84b7cSJohan Hedberg hdev->req_status = HCI_REQ_PEND; 17975e84b7cSJohan Hedberg 18075e84b7cSJohan Hedberg add_wait_queue(&hdev->req_wait_q, &wait); 18175e84b7cSJohan Hedberg set_current_state(TASK_INTERRUPTIBLE); 18275e84b7cSJohan Hedberg 183f60cb305SJohan Hedberg err = hci_req_run_skb(&req, hci_req_sync_complete); 184039fada5SChan-yeol Park if (err < 0) { 185039fada5SChan-yeol Park remove_wait_queue(&hdev->req_wait_q, &wait); 18622a3ceabSJohan Hedberg set_current_state(TASK_RUNNING); 187039fada5SChan-yeol Park return ERR_PTR(err); 188039fada5SChan-yeol Park } 189039fada5SChan-yeol Park 19075e84b7cSJohan Hedberg schedule_timeout(timeout); 19175e84b7cSJohan Hedberg 19275e84b7cSJohan Hedberg remove_wait_queue(&hdev->req_wait_q, &wait); 19375e84b7cSJohan Hedberg 19475e84b7cSJohan Hedberg if (signal_pending(current)) 19575e84b7cSJohan Hedberg return ERR_PTR(-EINTR); 19675e84b7cSJohan Hedberg 19775e84b7cSJohan Hedberg switch (hdev->req_status) { 19875e84b7cSJohan Hedberg case HCI_REQ_DONE: 19975e84b7cSJohan Hedberg err = -bt_to_errno(hdev->req_result); 20075e84b7cSJohan Hedberg break; 20175e84b7cSJohan Hedberg 20275e84b7cSJohan Hedberg case HCI_REQ_CANCELED: 20375e84b7cSJohan Hedberg err = -hdev->req_result; 20475e84b7cSJohan Hedberg break; 20575e84b7cSJohan Hedberg 20675e84b7cSJohan Hedberg default: 20775e84b7cSJohan Hedberg err = -ETIMEDOUT; 20875e84b7cSJohan Hedberg break; 20975e84b7cSJohan Hedberg } 21075e84b7cSJohan Hedberg 21175e84b7cSJohan Hedberg hdev->req_status = hdev->req_result = 0; 212f60cb305SJohan Hedberg skb = hdev->req_skb; 213f60cb305SJohan Hedberg hdev->req_skb = NULL; 21475e84b7cSJohan Hedberg 21575e84b7cSJohan Hedberg BT_DBG("%s end: err %d", hdev->name, err); 21675e84b7cSJohan Hedberg 217f60cb305SJohan Hedberg if (err < 0) { 218f60cb305SJohan Hedberg kfree_skb(skb); 21975e84b7cSJohan Hedberg return ERR_PTR(err); 220f60cb305SJohan Hedberg } 22175e84b7cSJohan Hedberg 222757aa0b5SJohan Hedberg if (!skb) 223757aa0b5SJohan Hedberg return ERR_PTR(-ENODATA); 224757aa0b5SJohan Hedberg 225757aa0b5SJohan Hedberg return skb; 2267b1abbbeSJohan Hedberg } 2277b1abbbeSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync_ev); 2287b1abbbeSJohan Hedberg 2297b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, 23007dc93ddSJohan Hedberg const void *param, u32 timeout) 2317b1abbbeSJohan Hedberg { 2327b1abbbeSJohan Hedberg return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout); 23375e84b7cSJohan Hedberg } 23475e84b7cSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync); 23575e84b7cSJohan Hedberg 2361da177e4SLinus Torvalds /* Execute request and wait for completion. */ 23701178cd4SJohan Hedberg static int __hci_req_sync(struct hci_dev *hdev, 23842c6b129SJohan Hedberg void (*func)(struct hci_request *req, 23942c6b129SJohan Hedberg unsigned long opt), 2401da177e4SLinus Torvalds unsigned long opt, __u32 timeout) 2411da177e4SLinus Torvalds { 24242c6b129SJohan Hedberg struct hci_request req; 2431da177e4SLinus Torvalds DECLARE_WAITQUEUE(wait, current); 2441da177e4SLinus Torvalds int err = 0; 2451da177e4SLinus Torvalds 2461da177e4SLinus Torvalds BT_DBG("%s start", hdev->name); 2471da177e4SLinus Torvalds 24842c6b129SJohan Hedberg hci_req_init(&req, hdev); 24942c6b129SJohan Hedberg 2501da177e4SLinus Torvalds hdev->req_status = HCI_REQ_PEND; 2511da177e4SLinus Torvalds 25242c6b129SJohan Hedberg func(&req, opt); 25353cce22dSJohan Hedberg 254039fada5SChan-yeol Park add_wait_queue(&hdev->req_wait_q, &wait); 255039fada5SChan-yeol Park set_current_state(TASK_INTERRUPTIBLE); 256039fada5SChan-yeol Park 257f60cb305SJohan Hedberg err = hci_req_run_skb(&req, hci_req_sync_complete); 25842c6b129SJohan Hedberg if (err < 0) { 25953cce22dSJohan Hedberg hdev->req_status = 0; 260920c8300SAndre Guedes 261039fada5SChan-yeol Park remove_wait_queue(&hdev->req_wait_q, &wait); 26222a3ceabSJohan Hedberg set_current_state(TASK_RUNNING); 263039fada5SChan-yeol Park 264920c8300SAndre Guedes /* ENODATA means the HCI request command queue is empty. 265920c8300SAndre Guedes * This can happen when a request with conditionals doesn't 266920c8300SAndre Guedes * trigger any commands to be sent. This is normal behavior 267920c8300SAndre Guedes * and should not trigger an error return. 26842c6b129SJohan Hedberg */ 269920c8300SAndre Guedes if (err == -ENODATA) 27042c6b129SJohan Hedberg return 0; 271920c8300SAndre Guedes 272920c8300SAndre Guedes return err; 27353cce22dSJohan Hedberg } 27453cce22dSJohan Hedberg 2751da177e4SLinus Torvalds schedule_timeout(timeout); 2761da177e4SLinus Torvalds 2771da177e4SLinus Torvalds remove_wait_queue(&hdev->req_wait_q, &wait); 2781da177e4SLinus Torvalds 2791da177e4SLinus Torvalds if (signal_pending(current)) 2801da177e4SLinus Torvalds return -EINTR; 2811da177e4SLinus Torvalds 2821da177e4SLinus Torvalds switch (hdev->req_status) { 2831da177e4SLinus Torvalds case HCI_REQ_DONE: 284e175072fSJoe Perches err = -bt_to_errno(hdev->req_result); 2851da177e4SLinus Torvalds break; 2861da177e4SLinus Torvalds 2871da177e4SLinus Torvalds case HCI_REQ_CANCELED: 2881da177e4SLinus Torvalds err = -hdev->req_result; 2891da177e4SLinus Torvalds break; 2901da177e4SLinus Torvalds 2911da177e4SLinus Torvalds default: 2921da177e4SLinus Torvalds err = -ETIMEDOUT; 2931da177e4SLinus Torvalds break; 2943ff50b79SStephen Hemminger } 2951da177e4SLinus Torvalds 296a5040efaSJohan Hedberg hdev->req_status = hdev->req_result = 0; 2971da177e4SLinus Torvalds 2981da177e4SLinus Torvalds BT_DBG("%s end: err %d", hdev->name, err); 2991da177e4SLinus Torvalds 3001da177e4SLinus Torvalds return err; 3011da177e4SLinus Torvalds } 3021da177e4SLinus Torvalds 30301178cd4SJohan Hedberg static int hci_req_sync(struct hci_dev *hdev, 30442c6b129SJohan Hedberg void (*req)(struct hci_request *req, 30542c6b129SJohan Hedberg unsigned long opt), 3061da177e4SLinus Torvalds unsigned long opt, __u32 timeout) 3071da177e4SLinus Torvalds { 3081da177e4SLinus Torvalds int ret; 3091da177e4SLinus Torvalds 3107c6a329eSMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) 3117c6a329eSMarcel Holtmann return -ENETDOWN; 3127c6a329eSMarcel Holtmann 3131da177e4SLinus Torvalds /* Serialize all requests */ 3141da177e4SLinus Torvalds hci_req_lock(hdev); 31501178cd4SJohan Hedberg ret = __hci_req_sync(hdev, req, opt, timeout); 3161da177e4SLinus Torvalds hci_req_unlock(hdev); 3171da177e4SLinus Torvalds 3181da177e4SLinus Torvalds return ret; 3191da177e4SLinus Torvalds } 3201da177e4SLinus Torvalds 32142c6b129SJohan Hedberg static void hci_reset_req(struct hci_request *req, unsigned long opt) 3221da177e4SLinus Torvalds { 32342c6b129SJohan Hedberg BT_DBG("%s %ld", req->hdev->name, opt); 3241da177e4SLinus Torvalds 3251da177e4SLinus Torvalds /* Reset device */ 32642c6b129SJohan Hedberg set_bit(HCI_RESET, &req->hdev->flags); 32742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_RESET, 0, NULL); 3281da177e4SLinus Torvalds } 3291da177e4SLinus Torvalds 33042c6b129SJohan Hedberg static void bredr_init(struct hci_request *req) 3311da177e4SLinus Torvalds { 33242c6b129SJohan Hedberg req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED; 3332455a3eaSAndrei Emeltchenko 3341da177e4SLinus Torvalds /* Read Local Supported Features */ 33542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); 3361da177e4SLinus Torvalds 3371143e5a6SMarcel Holtmann /* Read Local Version */ 33842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 3392177bab5SJohan Hedberg 3402177bab5SJohan Hedberg /* Read BD Address */ 34142c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL); 3421da177e4SLinus Torvalds } 3431da177e4SLinus Torvalds 3440af801b9SJohan Hedberg static void amp_init1(struct hci_request *req) 345e61ef499SAndrei Emeltchenko { 34642c6b129SJohan Hedberg req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED; 3472455a3eaSAndrei Emeltchenko 348e61ef499SAndrei Emeltchenko /* Read Local Version */ 34942c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 3506bcbc489SAndrei Emeltchenko 351f6996cfeSMarcel Holtmann /* Read Local Supported Commands */ 352f6996cfeSMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); 353f6996cfeSMarcel Holtmann 3546bcbc489SAndrei Emeltchenko /* Read Local AMP Info */ 35542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL); 356e71dfabaSAndrei Emeltchenko 357e71dfabaSAndrei Emeltchenko /* Read Data Blk size */ 35842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL); 3597528ca1cSMarcel Holtmann 360f38ba941SMarcel Holtmann /* Read Flow Control Mode */ 361f38ba941SMarcel Holtmann hci_req_add(req, HCI_OP_READ_FLOW_CONTROL_MODE, 0, NULL); 362f38ba941SMarcel Holtmann 3637528ca1cSMarcel Holtmann /* Read Location Data */ 3647528ca1cSMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCATION_DATA, 0, NULL); 365e61ef499SAndrei Emeltchenko } 366e61ef499SAndrei Emeltchenko 3670af801b9SJohan Hedberg static void amp_init2(struct hci_request *req) 3680af801b9SJohan Hedberg { 3690af801b9SJohan Hedberg /* Read Local Supported Features. Not all AMP controllers 3700af801b9SJohan Hedberg * support this so it's placed conditionally in the second 3710af801b9SJohan Hedberg * stage init. 3720af801b9SJohan Hedberg */ 3730af801b9SJohan Hedberg if (req->hdev->commands[14] & 0x20) 3740af801b9SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); 3750af801b9SJohan Hedberg } 3760af801b9SJohan Hedberg 37742c6b129SJohan Hedberg static void hci_init1_req(struct hci_request *req, unsigned long opt) 378e61ef499SAndrei Emeltchenko { 37942c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 380e61ef499SAndrei Emeltchenko 381e61ef499SAndrei Emeltchenko BT_DBG("%s %ld", hdev->name, opt); 382e61ef499SAndrei Emeltchenko 38311778716SAndrei Emeltchenko /* Reset */ 38411778716SAndrei Emeltchenko if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) 38542c6b129SJohan Hedberg hci_reset_req(req, 0); 38611778716SAndrei Emeltchenko 387e61ef499SAndrei Emeltchenko switch (hdev->dev_type) { 388e61ef499SAndrei Emeltchenko case HCI_BREDR: 38942c6b129SJohan Hedberg bredr_init(req); 390e61ef499SAndrei Emeltchenko break; 391e61ef499SAndrei Emeltchenko 392e61ef499SAndrei Emeltchenko case HCI_AMP: 3930af801b9SJohan Hedberg amp_init1(req); 394e61ef499SAndrei Emeltchenko break; 395e61ef499SAndrei Emeltchenko 396e61ef499SAndrei Emeltchenko default: 397e61ef499SAndrei Emeltchenko BT_ERR("Unknown device type %d", hdev->dev_type); 398e61ef499SAndrei Emeltchenko break; 399e61ef499SAndrei Emeltchenko } 400e61ef499SAndrei Emeltchenko } 401e61ef499SAndrei Emeltchenko 40242c6b129SJohan Hedberg static void bredr_setup(struct hci_request *req) 4032177bab5SJohan Hedberg { 4042177bab5SJohan Hedberg __le16 param; 4052177bab5SJohan Hedberg __u8 flt_type; 4062177bab5SJohan Hedberg 4072177bab5SJohan Hedberg /* Read Buffer Size (ACL mtu, max pkt, etc.) */ 40842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL); 4092177bab5SJohan Hedberg 4102177bab5SJohan Hedberg /* Read Class of Device */ 41142c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL); 4122177bab5SJohan Hedberg 4132177bab5SJohan Hedberg /* Read Local Name */ 41442c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL); 4152177bab5SJohan Hedberg 4162177bab5SJohan Hedberg /* Read Voice Setting */ 41742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL); 4182177bab5SJohan Hedberg 419b4cb9fb2SMarcel Holtmann /* Read Number of Supported IAC */ 420b4cb9fb2SMarcel Holtmann hci_req_add(req, HCI_OP_READ_NUM_SUPPORTED_IAC, 0, NULL); 421b4cb9fb2SMarcel Holtmann 4224b836f39SMarcel Holtmann /* Read Current IAC LAP */ 4234b836f39SMarcel Holtmann hci_req_add(req, HCI_OP_READ_CURRENT_IAC_LAP, 0, NULL); 4244b836f39SMarcel Holtmann 4252177bab5SJohan Hedberg /* Clear Event Filters */ 4262177bab5SJohan Hedberg flt_type = HCI_FLT_CLEAR_ALL; 42742c6b129SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type); 4282177bab5SJohan Hedberg 4292177bab5SJohan Hedberg /* Connection accept timeout ~20 secs */ 430dcf4adbfSJoe Perches param = cpu_to_le16(0x7d00); 43142c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); 4322177bab5SJohan Hedberg } 4332177bab5SJohan Hedberg 43442c6b129SJohan Hedberg static void le_setup(struct hci_request *req) 4352177bab5SJohan Hedberg { 436c73eee91SJohan Hedberg struct hci_dev *hdev = req->hdev; 437c73eee91SJohan Hedberg 4382177bab5SJohan Hedberg /* Read LE Buffer Size */ 43942c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL); 4402177bab5SJohan Hedberg 4412177bab5SJohan Hedberg /* Read LE Local Supported Features */ 44242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL); 4432177bab5SJohan Hedberg 444747d3f03SMarcel Holtmann /* Read LE Supported States */ 445747d3f03SMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL); 446747d3f03SMarcel Holtmann 4472177bab5SJohan Hedberg /* Read LE White List Size */ 44842c6b129SJohan Hedberg hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL); 4492177bab5SJohan Hedberg 450747d3f03SMarcel Holtmann /* Clear LE White List */ 451747d3f03SMarcel Holtmann hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL); 452c73eee91SJohan Hedberg 453c73eee91SJohan Hedberg /* LE-only controllers have LE implicitly enabled */ 454c73eee91SJohan Hedberg if (!lmp_bredr_capable(hdev)) 455a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_LE_ENABLED); 4562177bab5SJohan Hedberg } 4572177bab5SJohan Hedberg 45842c6b129SJohan Hedberg static void hci_setup_event_mask(struct hci_request *req) 4592177bab5SJohan Hedberg { 46042c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 46142c6b129SJohan Hedberg 4622177bab5SJohan Hedberg /* The second byte is 0xff instead of 0x9f (two reserved bits 4632177bab5SJohan Hedberg * disabled) since a Broadcom 1.2 dongle doesn't respond to the 4642177bab5SJohan Hedberg * command otherwise. 4652177bab5SJohan Hedberg */ 4662177bab5SJohan Hedberg u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 }; 4672177bab5SJohan Hedberg 4682177bab5SJohan Hedberg /* CSR 1.1 dongles does not accept any bitfield so don't try to set 4692177bab5SJohan Hedberg * any event mask for pre 1.2 devices. 4702177bab5SJohan Hedberg */ 4712177bab5SJohan Hedberg if (hdev->hci_ver < BLUETOOTH_VER_1_2) 4722177bab5SJohan Hedberg return; 4732177bab5SJohan Hedberg 4742177bab5SJohan Hedberg if (lmp_bredr_capable(hdev)) { 4752177bab5SJohan Hedberg events[4] |= 0x01; /* Flow Specification Complete */ 4762177bab5SJohan Hedberg events[4] |= 0x02; /* Inquiry Result with RSSI */ 4772177bab5SJohan Hedberg events[4] |= 0x04; /* Read Remote Extended Features Complete */ 4782177bab5SJohan Hedberg events[5] |= 0x08; /* Synchronous Connection Complete */ 4792177bab5SJohan Hedberg events[5] |= 0x10; /* Synchronous Connection Changed */ 480c7882cbdSMarcel Holtmann } else { 481c7882cbdSMarcel Holtmann /* Use a different default for LE-only devices */ 482c7882cbdSMarcel Holtmann memset(events, 0, sizeof(events)); 483c7882cbdSMarcel Holtmann events[0] |= 0x10; /* Disconnection Complete */ 484c7882cbdSMarcel Holtmann events[1] |= 0x08; /* Read Remote Version Information Complete */ 485c7882cbdSMarcel Holtmann events[1] |= 0x20; /* Command Complete */ 486c7882cbdSMarcel Holtmann events[1] |= 0x40; /* Command Status */ 487c7882cbdSMarcel Holtmann events[1] |= 0x80; /* Hardware Error */ 488c7882cbdSMarcel Holtmann events[2] |= 0x04; /* Number of Completed Packets */ 489c7882cbdSMarcel Holtmann events[3] |= 0x02; /* Data Buffer Overflow */ 4900da71f1bSMarcel Holtmann 4910da71f1bSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_ENCRYPTION) { 4920da71f1bSMarcel Holtmann events[0] |= 0x80; /* Encryption Change */ 493c7882cbdSMarcel Holtmann events[5] |= 0x80; /* Encryption Key Refresh Complete */ 4942177bab5SJohan Hedberg } 4950da71f1bSMarcel Holtmann } 4962177bab5SJohan Hedberg 4972177bab5SJohan Hedberg if (lmp_inq_rssi_capable(hdev)) 4982177bab5SJohan Hedberg events[4] |= 0x02; /* Inquiry Result with RSSI */ 4992177bab5SJohan Hedberg 5002177bab5SJohan Hedberg if (lmp_sniffsubr_capable(hdev)) 5012177bab5SJohan Hedberg events[5] |= 0x20; /* Sniff Subrating */ 5022177bab5SJohan Hedberg 5032177bab5SJohan Hedberg if (lmp_pause_enc_capable(hdev)) 5042177bab5SJohan Hedberg events[5] |= 0x80; /* Encryption Key Refresh Complete */ 5052177bab5SJohan Hedberg 5062177bab5SJohan Hedberg if (lmp_ext_inq_capable(hdev)) 5072177bab5SJohan Hedberg events[5] |= 0x40; /* Extended Inquiry Result */ 5082177bab5SJohan Hedberg 5092177bab5SJohan Hedberg if (lmp_no_flush_capable(hdev)) 5102177bab5SJohan Hedberg events[7] |= 0x01; /* Enhanced Flush Complete */ 5112177bab5SJohan Hedberg 5122177bab5SJohan Hedberg if (lmp_lsto_capable(hdev)) 5132177bab5SJohan Hedberg events[6] |= 0x80; /* Link Supervision Timeout Changed */ 5142177bab5SJohan Hedberg 5152177bab5SJohan Hedberg if (lmp_ssp_capable(hdev)) { 5162177bab5SJohan Hedberg events[6] |= 0x01; /* IO Capability Request */ 5172177bab5SJohan Hedberg events[6] |= 0x02; /* IO Capability Response */ 5182177bab5SJohan Hedberg events[6] |= 0x04; /* User Confirmation Request */ 5192177bab5SJohan Hedberg events[6] |= 0x08; /* User Passkey Request */ 5202177bab5SJohan Hedberg events[6] |= 0x10; /* Remote OOB Data Request */ 5212177bab5SJohan Hedberg events[6] |= 0x20; /* Simple Pairing Complete */ 5222177bab5SJohan Hedberg events[7] |= 0x04; /* User Passkey Notification */ 5232177bab5SJohan Hedberg events[7] |= 0x08; /* Keypress Notification */ 5242177bab5SJohan Hedberg events[7] |= 0x10; /* Remote Host Supported 5252177bab5SJohan Hedberg * Features Notification 5262177bab5SJohan Hedberg */ 5272177bab5SJohan Hedberg } 5282177bab5SJohan Hedberg 5292177bab5SJohan Hedberg if (lmp_le_capable(hdev)) 5302177bab5SJohan Hedberg events[7] |= 0x20; /* LE Meta-Event */ 5312177bab5SJohan Hedberg 53242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events); 5332177bab5SJohan Hedberg } 5342177bab5SJohan Hedberg 53542c6b129SJohan Hedberg static void hci_init2_req(struct hci_request *req, unsigned long opt) 5362177bab5SJohan Hedberg { 53742c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 53842c6b129SJohan Hedberg 5390af801b9SJohan Hedberg if (hdev->dev_type == HCI_AMP) 5400af801b9SJohan Hedberg return amp_init2(req); 5410af801b9SJohan Hedberg 5422177bab5SJohan Hedberg if (lmp_bredr_capable(hdev)) 54342c6b129SJohan Hedberg bredr_setup(req); 54456f87901SJohan Hedberg else 545a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); 5462177bab5SJohan Hedberg 5472177bab5SJohan Hedberg if (lmp_le_capable(hdev)) 54842c6b129SJohan Hedberg le_setup(req); 5492177bab5SJohan Hedberg 5500f3adeaeSMarcel Holtmann /* All Bluetooth 1.2 and later controllers should support the 5510f3adeaeSMarcel Holtmann * HCI command for reading the local supported commands. 5520f3adeaeSMarcel Holtmann * 5530f3adeaeSMarcel Holtmann * Unfortunately some controllers indicate Bluetooth 1.2 support, 5540f3adeaeSMarcel Holtmann * but do not have support for this command. If that is the case, 5550f3adeaeSMarcel Holtmann * the driver can quirk the behavior and skip reading the local 5560f3adeaeSMarcel Holtmann * supported commands. 5573f8e2d75SJohan Hedberg */ 5580f3adeaeSMarcel Holtmann if (hdev->hci_ver > BLUETOOTH_VER_1_1 && 5590f3adeaeSMarcel Holtmann !test_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks)) 56042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); 5612177bab5SJohan Hedberg 5622177bab5SJohan Hedberg if (lmp_ssp_capable(hdev)) { 56357af75a8SMarcel Holtmann /* When SSP is available, then the host features page 56457af75a8SMarcel Holtmann * should also be available as well. However some 56557af75a8SMarcel Holtmann * controllers list the max_page as 0 as long as SSP 56657af75a8SMarcel Holtmann * has not been enabled. To achieve proper debugging 56757af75a8SMarcel Holtmann * output, force the minimum max_page to 1 at least. 56857af75a8SMarcel Holtmann */ 56957af75a8SMarcel Holtmann hdev->max_page = 0x01; 57057af75a8SMarcel Holtmann 571d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { 5722177bab5SJohan Hedberg u8 mode = 0x01; 573574ea3c7SMarcel Holtmann 57442c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_SSP_MODE, 5752177bab5SJohan Hedberg sizeof(mode), &mode); 5762177bab5SJohan Hedberg } else { 5772177bab5SJohan Hedberg struct hci_cp_write_eir cp; 5782177bab5SJohan Hedberg 5792177bab5SJohan Hedberg memset(hdev->eir, 0, sizeof(hdev->eir)); 5802177bab5SJohan Hedberg memset(&cp, 0, sizeof(cp)); 5812177bab5SJohan Hedberg 58242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp); 5832177bab5SJohan Hedberg } 5842177bab5SJohan Hedberg } 5852177bab5SJohan Hedberg 586043ec9bfSMarcel Holtmann if (lmp_inq_rssi_capable(hdev) || 587043ec9bfSMarcel Holtmann test_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks)) { 58804422da9SMarcel Holtmann u8 mode; 58904422da9SMarcel Holtmann 59004422da9SMarcel Holtmann /* If Extended Inquiry Result events are supported, then 59104422da9SMarcel Holtmann * they are clearly preferred over Inquiry Result with RSSI 59204422da9SMarcel Holtmann * events. 59304422da9SMarcel Holtmann */ 59404422da9SMarcel Holtmann mode = lmp_ext_inq_capable(hdev) ? 0x02 : 0x01; 59504422da9SMarcel Holtmann 59604422da9SMarcel Holtmann hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode); 59704422da9SMarcel Holtmann } 5982177bab5SJohan Hedberg 5992177bab5SJohan Hedberg if (lmp_inq_tx_pwr_capable(hdev)) 60042c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL); 6012177bab5SJohan Hedberg 6022177bab5SJohan Hedberg if (lmp_ext_feat_capable(hdev)) { 6032177bab5SJohan Hedberg struct hci_cp_read_local_ext_features cp; 6042177bab5SJohan Hedberg 6052177bab5SJohan Hedberg cp.page = 0x01; 60642c6b129SJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES, 60742c6b129SJohan Hedberg sizeof(cp), &cp); 6082177bab5SJohan Hedberg } 6092177bab5SJohan Hedberg 610d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { 6112177bab5SJohan Hedberg u8 enable = 1; 61242c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable), 6132177bab5SJohan Hedberg &enable); 6142177bab5SJohan Hedberg } 6152177bab5SJohan Hedberg } 6162177bab5SJohan Hedberg 61742c6b129SJohan Hedberg static void hci_setup_link_policy(struct hci_request *req) 6182177bab5SJohan Hedberg { 61942c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 6202177bab5SJohan Hedberg struct hci_cp_write_def_link_policy cp; 6212177bab5SJohan Hedberg u16 link_policy = 0; 6222177bab5SJohan Hedberg 6232177bab5SJohan Hedberg if (lmp_rswitch_capable(hdev)) 6242177bab5SJohan Hedberg link_policy |= HCI_LP_RSWITCH; 6252177bab5SJohan Hedberg if (lmp_hold_capable(hdev)) 6262177bab5SJohan Hedberg link_policy |= HCI_LP_HOLD; 6272177bab5SJohan Hedberg if (lmp_sniff_capable(hdev)) 6282177bab5SJohan Hedberg link_policy |= HCI_LP_SNIFF; 6292177bab5SJohan Hedberg if (lmp_park_capable(hdev)) 6302177bab5SJohan Hedberg link_policy |= HCI_LP_PARK; 6312177bab5SJohan Hedberg 6322177bab5SJohan Hedberg cp.policy = cpu_to_le16(link_policy); 63342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp); 6342177bab5SJohan Hedberg } 6352177bab5SJohan Hedberg 63642c6b129SJohan Hedberg static void hci_set_le_support(struct hci_request *req) 6372177bab5SJohan Hedberg { 63842c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 6392177bab5SJohan Hedberg struct hci_cp_write_le_host_supported cp; 6402177bab5SJohan Hedberg 641c73eee91SJohan Hedberg /* LE-only devices do not support explicit enablement */ 642c73eee91SJohan Hedberg if (!lmp_bredr_capable(hdev)) 643c73eee91SJohan Hedberg return; 644c73eee91SJohan Hedberg 6452177bab5SJohan Hedberg memset(&cp, 0, sizeof(cp)); 6462177bab5SJohan Hedberg 647d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { 6482177bab5SJohan Hedberg cp.le = 0x01; 64932226e4fSMarcel Holtmann cp.simul = 0x00; 6502177bab5SJohan Hedberg } 6512177bab5SJohan Hedberg 6522177bab5SJohan Hedberg if (cp.le != lmp_host_le_capable(hdev)) 65342c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp), 6542177bab5SJohan Hedberg &cp); 6552177bab5SJohan Hedberg } 6562177bab5SJohan Hedberg 657d62e6d67SJohan Hedberg static void hci_set_event_mask_page_2(struct hci_request *req) 658d62e6d67SJohan Hedberg { 659d62e6d67SJohan Hedberg struct hci_dev *hdev = req->hdev; 660d62e6d67SJohan Hedberg u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 661d62e6d67SJohan Hedberg 662d62e6d67SJohan Hedberg /* If Connectionless Slave Broadcast master role is supported 663d62e6d67SJohan Hedberg * enable all necessary events for it. 664d62e6d67SJohan Hedberg */ 66553b834d2SMarcel Holtmann if (lmp_csb_master_capable(hdev)) { 666d62e6d67SJohan Hedberg events[1] |= 0x40; /* Triggered Clock Capture */ 667d62e6d67SJohan Hedberg events[1] |= 0x80; /* Synchronization Train Complete */ 668d62e6d67SJohan Hedberg events[2] |= 0x10; /* Slave Page Response Timeout */ 669d62e6d67SJohan Hedberg events[2] |= 0x20; /* CSB Channel Map Change */ 670d62e6d67SJohan Hedberg } 671d62e6d67SJohan Hedberg 672d62e6d67SJohan Hedberg /* If Connectionless Slave Broadcast slave role is supported 673d62e6d67SJohan Hedberg * enable all necessary events for it. 674d62e6d67SJohan Hedberg */ 67553b834d2SMarcel Holtmann if (lmp_csb_slave_capable(hdev)) { 676d62e6d67SJohan Hedberg events[2] |= 0x01; /* Synchronization Train Received */ 677d62e6d67SJohan Hedberg events[2] |= 0x02; /* CSB Receive */ 678d62e6d67SJohan Hedberg events[2] |= 0x04; /* CSB Timeout */ 679d62e6d67SJohan Hedberg events[2] |= 0x08; /* Truncated Page Complete */ 680d62e6d67SJohan Hedberg } 681d62e6d67SJohan Hedberg 68240c59fcbSMarcel Holtmann /* Enable Authenticated Payload Timeout Expired event if supported */ 683cd7ca0ecSMarcel Holtmann if (lmp_ping_capable(hdev) || hdev->le_features[0] & HCI_LE_PING) 68440c59fcbSMarcel Holtmann events[2] |= 0x80; 68540c59fcbSMarcel Holtmann 686d62e6d67SJohan Hedberg hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2, sizeof(events), events); 687d62e6d67SJohan Hedberg } 688d62e6d67SJohan Hedberg 68942c6b129SJohan Hedberg static void hci_init3_req(struct hci_request *req, unsigned long opt) 6902177bab5SJohan Hedberg { 69142c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 692d2c5d77fSJohan Hedberg u8 p; 69342c6b129SJohan Hedberg 6940da71f1bSMarcel Holtmann hci_setup_event_mask(req); 6950da71f1bSMarcel Holtmann 69648ce62c4SMarcel Holtmann if (hdev->commands[6] & 0x20) { 69748ce62c4SMarcel Holtmann struct hci_cp_read_stored_link_key cp; 69848ce62c4SMarcel Holtmann 69948ce62c4SMarcel Holtmann bacpy(&cp.bdaddr, BDADDR_ANY); 70048ce62c4SMarcel Holtmann cp.read_all = 0x01; 70148ce62c4SMarcel Holtmann hci_req_add(req, HCI_OP_READ_STORED_LINK_KEY, sizeof(cp), &cp); 70248ce62c4SMarcel Holtmann } 70348ce62c4SMarcel Holtmann 7042177bab5SJohan Hedberg if (hdev->commands[5] & 0x10) 70542c6b129SJohan Hedberg hci_setup_link_policy(req); 7062177bab5SJohan Hedberg 707417287deSMarcel Holtmann if (hdev->commands[8] & 0x01) 708417287deSMarcel Holtmann hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL); 709417287deSMarcel Holtmann 710417287deSMarcel Holtmann /* Some older Broadcom based Bluetooth 1.2 controllers do not 711417287deSMarcel Holtmann * support the Read Page Scan Type command. Check support for 712417287deSMarcel Holtmann * this command in the bit mask of supported commands. 713417287deSMarcel Holtmann */ 714417287deSMarcel Holtmann if (hdev->commands[13] & 0x01) 715417287deSMarcel Holtmann hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL); 716417287deSMarcel Holtmann 7179193c6e8SAndre Guedes if (lmp_le_capable(hdev)) { 7189193c6e8SAndre Guedes u8 events[8]; 7199193c6e8SAndre Guedes 7209193c6e8SAndre Guedes memset(events, 0, sizeof(events)); 7214d6c705bSMarcel Holtmann events[0] = 0x0f; 7224d6c705bSMarcel Holtmann 7234d6c705bSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_ENCRYPTION) 7244d6c705bSMarcel Holtmann events[0] |= 0x10; /* LE Long Term Key Request */ 725662bc2e6SAndre Guedes 726662bc2e6SAndre Guedes /* If controller supports the Connection Parameters Request 727662bc2e6SAndre Guedes * Link Layer Procedure, enable the corresponding event. 728662bc2e6SAndre Guedes */ 729662bc2e6SAndre Guedes if (hdev->le_features[0] & HCI_LE_CONN_PARAM_REQ_PROC) 730662bc2e6SAndre Guedes events[0] |= 0x20; /* LE Remote Connection 731662bc2e6SAndre Guedes * Parameter Request 732662bc2e6SAndre Guedes */ 733662bc2e6SAndre Guedes 734a9f6068eSMarcel Holtmann /* If the controller supports the Data Length Extension 735a9f6068eSMarcel Holtmann * feature, enable the corresponding event. 736a9f6068eSMarcel Holtmann */ 737a9f6068eSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) 738a9f6068eSMarcel Holtmann events[0] |= 0x40; /* LE Data Length Change */ 739a9f6068eSMarcel Holtmann 7404b71bba4SMarcel Holtmann /* If the controller supports Extended Scanner Filter 7414b71bba4SMarcel Holtmann * Policies, enable the correspondig event. 7424b71bba4SMarcel Holtmann */ 7434b71bba4SMarcel Holtmann if (hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY) 7444b71bba4SMarcel Holtmann events[1] |= 0x04; /* LE Direct Advertising 7454b71bba4SMarcel Holtmann * Report 7464b71bba4SMarcel Holtmann */ 7474b71bba4SMarcel Holtmann 7485a34bd5fSMarcel Holtmann /* If the controller supports the LE Read Local P-256 7495a34bd5fSMarcel Holtmann * Public Key command, enable the corresponding event. 7505a34bd5fSMarcel Holtmann */ 7515a34bd5fSMarcel Holtmann if (hdev->commands[34] & 0x02) 7525a34bd5fSMarcel Holtmann events[0] |= 0x80; /* LE Read Local P-256 7535a34bd5fSMarcel Holtmann * Public Key Complete 7545a34bd5fSMarcel Holtmann */ 7555a34bd5fSMarcel Holtmann 7565a34bd5fSMarcel Holtmann /* If the controller supports the LE Generate DHKey 7575a34bd5fSMarcel Holtmann * command, enable the corresponding event. 7585a34bd5fSMarcel Holtmann */ 7595a34bd5fSMarcel Holtmann if (hdev->commands[34] & 0x04) 7605a34bd5fSMarcel Holtmann events[1] |= 0x01; /* LE Generate DHKey Complete */ 7615a34bd5fSMarcel Holtmann 7629193c6e8SAndre Guedes hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events), 7639193c6e8SAndre Guedes events); 7649193c6e8SAndre Guedes 76515a49ccaSMarcel Holtmann if (hdev->commands[25] & 0x40) { 76615a49ccaSMarcel Holtmann /* Read LE Advertising Channel TX Power */ 76715a49ccaSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL); 76815a49ccaSMarcel Holtmann } 76915a49ccaSMarcel Holtmann 770a9f6068eSMarcel Holtmann if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) { 771a9f6068eSMarcel Holtmann /* Read LE Maximum Data Length */ 772a9f6068eSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_MAX_DATA_LEN, 0, NULL); 773a9f6068eSMarcel Holtmann 774a9f6068eSMarcel Holtmann /* Read LE Suggested Default Data Length */ 775a9f6068eSMarcel Holtmann hci_req_add(req, HCI_OP_LE_READ_DEF_DATA_LEN, 0, NULL); 776a9f6068eSMarcel Holtmann } 777a9f6068eSMarcel Holtmann 77842c6b129SJohan Hedberg hci_set_le_support(req); 7799193c6e8SAndre Guedes } 780d2c5d77fSJohan Hedberg 781d2c5d77fSJohan Hedberg /* Read features beyond page 1 if available */ 782d2c5d77fSJohan Hedberg for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) { 783d2c5d77fSJohan Hedberg struct hci_cp_read_local_ext_features cp; 784d2c5d77fSJohan Hedberg 785d2c5d77fSJohan Hedberg cp.page = p; 786d2c5d77fSJohan Hedberg hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES, 787d2c5d77fSJohan Hedberg sizeof(cp), &cp); 788d2c5d77fSJohan Hedberg } 7892177bab5SJohan Hedberg } 7902177bab5SJohan Hedberg 7915d4e7e8dSJohan Hedberg static void hci_init4_req(struct hci_request *req, unsigned long opt) 7925d4e7e8dSJohan Hedberg { 7935d4e7e8dSJohan Hedberg struct hci_dev *hdev = req->hdev; 7945d4e7e8dSJohan Hedberg 79536f260ceSMarcel Holtmann /* Some Broadcom based Bluetooth controllers do not support the 79636f260ceSMarcel Holtmann * Delete Stored Link Key command. They are clearly indicating its 79736f260ceSMarcel Holtmann * absence in the bit mask of supported commands. 79836f260ceSMarcel Holtmann * 79936f260ceSMarcel Holtmann * Check the supported commands and only if the the command is marked 80036f260ceSMarcel Holtmann * as supported send it. If not supported assume that the controller 80136f260ceSMarcel Holtmann * does not have actual support for stored link keys which makes this 80236f260ceSMarcel Holtmann * command redundant anyway. 80336f260ceSMarcel Holtmann * 80436f260ceSMarcel Holtmann * Some controllers indicate that they support handling deleting 80536f260ceSMarcel Holtmann * stored link keys, but they don't. The quirk lets a driver 80636f260ceSMarcel Holtmann * just disable this command. 80736f260ceSMarcel Holtmann */ 80836f260ceSMarcel Holtmann if (hdev->commands[6] & 0x80 && 80936f260ceSMarcel Holtmann !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) { 81036f260ceSMarcel Holtmann struct hci_cp_delete_stored_link_key cp; 81136f260ceSMarcel Holtmann 81236f260ceSMarcel Holtmann bacpy(&cp.bdaddr, BDADDR_ANY); 81336f260ceSMarcel Holtmann cp.delete_all = 0x01; 81436f260ceSMarcel Holtmann hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY, 81536f260ceSMarcel Holtmann sizeof(cp), &cp); 81636f260ceSMarcel Holtmann } 81736f260ceSMarcel Holtmann 818d62e6d67SJohan Hedberg /* Set event mask page 2 if the HCI command for it is supported */ 819d62e6d67SJohan Hedberg if (hdev->commands[22] & 0x04) 820d62e6d67SJohan Hedberg hci_set_event_mask_page_2(req); 821d62e6d67SJohan Hedberg 822109e3191SMarcel Holtmann /* Read local codec list if the HCI command is supported */ 823109e3191SMarcel Holtmann if (hdev->commands[29] & 0x20) 824109e3191SMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL); 825109e3191SMarcel Holtmann 826f4fe73edSMarcel Holtmann /* Get MWS transport configuration if the HCI command is supported */ 827f4fe73edSMarcel Holtmann if (hdev->commands[30] & 0x08) 828f4fe73edSMarcel Holtmann hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL); 829f4fe73edSMarcel Holtmann 8305d4e7e8dSJohan Hedberg /* Check for Synchronization Train support */ 83153b834d2SMarcel Holtmann if (lmp_sync_train_capable(hdev)) 8325d4e7e8dSJohan Hedberg hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL); 833a6d0d690SMarcel Holtmann 834a6d0d690SMarcel Holtmann /* Enable Secure Connections if supported and configured */ 835d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED) && 836574ea3c7SMarcel Holtmann bredr_sc_enabled(hdev)) { 837a6d0d690SMarcel Holtmann u8 support = 0x01; 838574ea3c7SMarcel Holtmann 839a6d0d690SMarcel Holtmann hci_req_add(req, HCI_OP_WRITE_SC_SUPPORT, 840a6d0d690SMarcel Holtmann sizeof(support), &support); 841a6d0d690SMarcel Holtmann } 8425d4e7e8dSJohan Hedberg } 8435d4e7e8dSJohan Hedberg 8442177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev) 8452177bab5SJohan Hedberg { 8462177bab5SJohan Hedberg int err; 8472177bab5SJohan Hedberg 8482177bab5SJohan Hedberg err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT); 8492177bab5SJohan Hedberg if (err < 0) 8502177bab5SJohan Hedberg return err; 8512177bab5SJohan Hedberg 8524b4148e9SMarcel Holtmann /* The Device Under Test (DUT) mode is special and available for 8534b4148e9SMarcel Holtmann * all controller types. So just create it early on. 8544b4148e9SMarcel Holtmann */ 855d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SETUP)) { 8564b4148e9SMarcel Holtmann debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev, 8574b4148e9SMarcel Holtmann &dut_mode_fops); 8584b4148e9SMarcel Holtmann } 8594b4148e9SMarcel Holtmann 8602177bab5SJohan Hedberg err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT); 8612177bab5SJohan Hedberg if (err < 0) 8622177bab5SJohan Hedberg return err; 8632177bab5SJohan Hedberg 8640af801b9SJohan Hedberg /* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode 8650af801b9SJohan Hedberg * BR/EDR/LE type controllers. AMP controllers only need the 8660af801b9SJohan Hedberg * first two stages of init. 8670af801b9SJohan Hedberg */ 8680af801b9SJohan Hedberg if (hdev->dev_type != HCI_BREDR) 8690af801b9SJohan Hedberg return 0; 8700af801b9SJohan Hedberg 8715d4e7e8dSJohan Hedberg err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT); 8725d4e7e8dSJohan Hedberg if (err < 0) 8735d4e7e8dSJohan Hedberg return err; 8745d4e7e8dSJohan Hedberg 875baf27f6eSMarcel Holtmann err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT); 876baf27f6eSMarcel Holtmann if (err < 0) 877baf27f6eSMarcel Holtmann return err; 878baf27f6eSMarcel Holtmann 879ec6cef9cSMarcel Holtmann /* This function is only called when the controller is actually in 880ec6cef9cSMarcel Holtmann * configured state. When the controller is marked as unconfigured, 881ec6cef9cSMarcel Holtmann * this initialization procedure is not run. 882ec6cef9cSMarcel Holtmann * 883ec6cef9cSMarcel Holtmann * It means that it is possible that a controller runs through its 884ec6cef9cSMarcel Holtmann * setup phase and then discovers missing settings. If that is the 885ec6cef9cSMarcel Holtmann * case, then this function will not be called. It then will only 886ec6cef9cSMarcel Holtmann * be called during the config phase. 887ec6cef9cSMarcel Holtmann * 888ec6cef9cSMarcel Holtmann * So only when in setup phase or config phase, create the debugfs 889ec6cef9cSMarcel Holtmann * entries and register the SMP channels. 890baf27f6eSMarcel Holtmann */ 891d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 892d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) 893baf27f6eSMarcel Holtmann return 0; 894baf27f6eSMarcel Holtmann 89560c5f5fbSMarcel Holtmann hci_debugfs_create_common(hdev); 89660c5f5fbSMarcel Holtmann 89771c3b60eSMarcel Holtmann if (lmp_bredr_capable(hdev)) 89860c5f5fbSMarcel Holtmann hci_debugfs_create_bredr(hdev); 8992bfa3531SMarcel Holtmann 900162a3bacSMarcel Holtmann if (lmp_le_capable(hdev)) 90160c5f5fbSMarcel Holtmann hci_debugfs_create_le(hdev); 902e7b8fc92SMarcel Holtmann 903baf27f6eSMarcel Holtmann return 0; 9042177bab5SJohan Hedberg } 9052177bab5SJohan Hedberg 9060ebca7d6SMarcel Holtmann static void hci_init0_req(struct hci_request *req, unsigned long opt) 9070ebca7d6SMarcel Holtmann { 9080ebca7d6SMarcel Holtmann struct hci_dev *hdev = req->hdev; 9090ebca7d6SMarcel Holtmann 9100ebca7d6SMarcel Holtmann BT_DBG("%s %ld", hdev->name, opt); 9110ebca7d6SMarcel Holtmann 9120ebca7d6SMarcel Holtmann /* Reset */ 9130ebca7d6SMarcel Holtmann if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) 9140ebca7d6SMarcel Holtmann hci_reset_req(req, 0); 9150ebca7d6SMarcel Holtmann 9160ebca7d6SMarcel Holtmann /* Read Local Version */ 9170ebca7d6SMarcel Holtmann hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL); 9180ebca7d6SMarcel Holtmann 9190ebca7d6SMarcel Holtmann /* Read BD Address */ 9200ebca7d6SMarcel Holtmann if (hdev->set_bdaddr) 9210ebca7d6SMarcel Holtmann hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL); 9220ebca7d6SMarcel Holtmann } 9230ebca7d6SMarcel Holtmann 9240ebca7d6SMarcel Holtmann static int __hci_unconf_init(struct hci_dev *hdev) 9250ebca7d6SMarcel Holtmann { 9260ebca7d6SMarcel Holtmann int err; 9270ebca7d6SMarcel Holtmann 928cc78b44bSMarcel Holtmann if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) 929cc78b44bSMarcel Holtmann return 0; 930cc78b44bSMarcel Holtmann 9310ebca7d6SMarcel Holtmann err = __hci_req_sync(hdev, hci_init0_req, 0, HCI_INIT_TIMEOUT); 9320ebca7d6SMarcel Holtmann if (err < 0) 9330ebca7d6SMarcel Holtmann return err; 9340ebca7d6SMarcel Holtmann 9350ebca7d6SMarcel Holtmann return 0; 9360ebca7d6SMarcel Holtmann } 9370ebca7d6SMarcel Holtmann 93842c6b129SJohan Hedberg static void hci_scan_req(struct hci_request *req, unsigned long opt) 9391da177e4SLinus Torvalds { 9401da177e4SLinus Torvalds __u8 scan = opt; 9411da177e4SLinus Torvalds 94242c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, scan); 9431da177e4SLinus Torvalds 9441da177e4SLinus Torvalds /* Inquiry and Page scans */ 94542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); 9461da177e4SLinus Torvalds } 9471da177e4SLinus Torvalds 94842c6b129SJohan Hedberg static void hci_auth_req(struct hci_request *req, unsigned long opt) 9491da177e4SLinus Torvalds { 9501da177e4SLinus Torvalds __u8 auth = opt; 9511da177e4SLinus Torvalds 95242c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, auth); 9531da177e4SLinus Torvalds 9541da177e4SLinus Torvalds /* Authentication */ 95542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth); 9561da177e4SLinus Torvalds } 9571da177e4SLinus Torvalds 95842c6b129SJohan Hedberg static void hci_encrypt_req(struct hci_request *req, unsigned long opt) 9591da177e4SLinus Torvalds { 9601da177e4SLinus Torvalds __u8 encrypt = opt; 9611da177e4SLinus Torvalds 96242c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, encrypt); 9631da177e4SLinus Torvalds 964e4e8e37cSMarcel Holtmann /* Encryption */ 96542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt); 9661da177e4SLinus Torvalds } 9671da177e4SLinus Torvalds 96842c6b129SJohan Hedberg static void hci_linkpol_req(struct hci_request *req, unsigned long opt) 969e4e8e37cSMarcel Holtmann { 970e4e8e37cSMarcel Holtmann __le16 policy = cpu_to_le16(opt); 971e4e8e37cSMarcel Holtmann 97242c6b129SJohan Hedberg BT_DBG("%s %x", req->hdev->name, policy); 973e4e8e37cSMarcel Holtmann 974e4e8e37cSMarcel Holtmann /* Default link policy */ 97542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy); 976e4e8e37cSMarcel Holtmann } 977e4e8e37cSMarcel Holtmann 9781da177e4SLinus Torvalds /* Get HCI device by index. 9791da177e4SLinus Torvalds * Device is held on return. */ 9801da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index) 9811da177e4SLinus Torvalds { 9828035ded4SLuiz Augusto von Dentz struct hci_dev *hdev = NULL, *d; 9831da177e4SLinus Torvalds 9841da177e4SLinus Torvalds BT_DBG("%d", index); 9851da177e4SLinus Torvalds 9861da177e4SLinus Torvalds if (index < 0) 9871da177e4SLinus Torvalds return NULL; 9881da177e4SLinus Torvalds 9891da177e4SLinus Torvalds read_lock(&hci_dev_list_lock); 9908035ded4SLuiz Augusto von Dentz list_for_each_entry(d, &hci_dev_list, list) { 9911da177e4SLinus Torvalds if (d->id == index) { 9921da177e4SLinus Torvalds hdev = hci_dev_hold(d); 9931da177e4SLinus Torvalds break; 9941da177e4SLinus Torvalds } 9951da177e4SLinus Torvalds } 9961da177e4SLinus Torvalds read_unlock(&hci_dev_list_lock); 9971da177e4SLinus Torvalds return hdev; 9981da177e4SLinus Torvalds } 9991da177e4SLinus Torvalds 10001da177e4SLinus Torvalds /* ---- Inquiry support ---- */ 1001ff9ef578SJohan Hedberg 100230dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev) 100330dc78e1SJohan Hedberg { 100430dc78e1SJohan Hedberg struct discovery_state *discov = &hdev->discovery; 100530dc78e1SJohan Hedberg 10066fbe195dSAndre Guedes switch (discov->state) { 1007343f935bSAndre Guedes case DISCOVERY_FINDING: 10086fbe195dSAndre Guedes case DISCOVERY_RESOLVING: 100930dc78e1SJohan Hedberg return true; 101030dc78e1SJohan Hedberg 10116fbe195dSAndre Guedes default: 101230dc78e1SJohan Hedberg return false; 101330dc78e1SJohan Hedberg } 10146fbe195dSAndre Guedes } 101530dc78e1SJohan Hedberg 1016ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state) 1017ff9ef578SJohan Hedberg { 1018bb3e0a33SJohan Hedberg int old_state = hdev->discovery.state; 1019bb3e0a33SJohan Hedberg 1020ff9ef578SJohan Hedberg BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state); 1021ff9ef578SJohan Hedberg 1022bb3e0a33SJohan Hedberg if (old_state == state) 1023ff9ef578SJohan Hedberg return; 1024ff9ef578SJohan Hedberg 1025bb3e0a33SJohan Hedberg hdev->discovery.state = state; 1026bb3e0a33SJohan Hedberg 1027ff9ef578SJohan Hedberg switch (state) { 1028ff9ef578SJohan Hedberg case DISCOVERY_STOPPED: 1029c54c3860SAndre Guedes hci_update_background_scan(hdev); 1030c54c3860SAndre Guedes 1031bb3e0a33SJohan Hedberg if (old_state != DISCOVERY_STARTING) 1032ff9ef578SJohan Hedberg mgmt_discovering(hdev, 0); 1033ff9ef578SJohan Hedberg break; 1034ff9ef578SJohan Hedberg case DISCOVERY_STARTING: 1035ff9ef578SJohan Hedberg break; 1036343f935bSAndre Guedes case DISCOVERY_FINDING: 1037ff9ef578SJohan Hedberg mgmt_discovering(hdev, 1); 1038ff9ef578SJohan Hedberg break; 103930dc78e1SJohan Hedberg case DISCOVERY_RESOLVING: 104030dc78e1SJohan Hedberg break; 1041ff9ef578SJohan Hedberg case DISCOVERY_STOPPING: 1042ff9ef578SJohan Hedberg break; 1043ff9ef578SJohan Hedberg } 1044ff9ef578SJohan Hedberg } 1045ff9ef578SJohan Hedberg 10461f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev) 10471da177e4SLinus Torvalds { 104830883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1049b57c1a56SJohan Hedberg struct inquiry_entry *p, *n; 10501da177e4SLinus Torvalds 1051561aafbcSJohan Hedberg list_for_each_entry_safe(p, n, &cache->all, all) { 1052561aafbcSJohan Hedberg list_del(&p->all); 1053b57c1a56SJohan Hedberg kfree(p); 10541da177e4SLinus Torvalds } 1055561aafbcSJohan Hedberg 1056561aafbcSJohan Hedberg INIT_LIST_HEAD(&cache->unknown); 1057561aafbcSJohan Hedberg INIT_LIST_HEAD(&cache->resolve); 10581da177e4SLinus Torvalds } 10591da177e4SLinus Torvalds 1060a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, 1061a8c5fb1aSGustavo Padovan bdaddr_t *bdaddr) 10621da177e4SLinus Torvalds { 106330883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 10641da177e4SLinus Torvalds struct inquiry_entry *e; 10651da177e4SLinus Torvalds 10666ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, bdaddr); 10671da177e4SLinus Torvalds 1068561aafbcSJohan Hedberg list_for_each_entry(e, &cache->all, all) { 10691da177e4SLinus Torvalds if (!bacmp(&e->data.bdaddr, bdaddr)) 10701da177e4SLinus Torvalds return e; 10711da177e4SLinus Torvalds } 10721da177e4SLinus Torvalds 1073b57c1a56SJohan Hedberg return NULL; 1074b57c1a56SJohan Hedberg } 1075b57c1a56SJohan Hedberg 1076561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev, 1077561aafbcSJohan Hedberg bdaddr_t *bdaddr) 1078561aafbcSJohan Hedberg { 107930883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1080561aafbcSJohan Hedberg struct inquiry_entry *e; 1081561aafbcSJohan Hedberg 10826ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, bdaddr); 1083561aafbcSJohan Hedberg 1084561aafbcSJohan Hedberg list_for_each_entry(e, &cache->unknown, list) { 1085561aafbcSJohan Hedberg if (!bacmp(&e->data.bdaddr, bdaddr)) 1086561aafbcSJohan Hedberg return e; 1087561aafbcSJohan Hedberg } 1088561aafbcSJohan Hedberg 1089561aafbcSJohan Hedberg return NULL; 1090561aafbcSJohan Hedberg } 1091561aafbcSJohan Hedberg 109230dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev, 109330dc78e1SJohan Hedberg bdaddr_t *bdaddr, 109430dc78e1SJohan Hedberg int state) 109530dc78e1SJohan Hedberg { 109630dc78e1SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 109730dc78e1SJohan Hedberg struct inquiry_entry *e; 109830dc78e1SJohan Hedberg 10996ed93dc6SAndrei Emeltchenko BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state); 110030dc78e1SJohan Hedberg 110130dc78e1SJohan Hedberg list_for_each_entry(e, &cache->resolve, list) { 110230dc78e1SJohan Hedberg if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state) 110330dc78e1SJohan Hedberg return e; 110430dc78e1SJohan Hedberg if (!bacmp(&e->data.bdaddr, bdaddr)) 110530dc78e1SJohan Hedberg return e; 110630dc78e1SJohan Hedberg } 110730dc78e1SJohan Hedberg 110830dc78e1SJohan Hedberg return NULL; 110930dc78e1SJohan Hedberg } 111030dc78e1SJohan Hedberg 1111a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev, 1112a3d4e20aSJohan Hedberg struct inquiry_entry *ie) 1113a3d4e20aSJohan Hedberg { 1114a3d4e20aSJohan Hedberg struct discovery_state *cache = &hdev->discovery; 1115a3d4e20aSJohan Hedberg struct list_head *pos = &cache->resolve; 1116a3d4e20aSJohan Hedberg struct inquiry_entry *p; 1117a3d4e20aSJohan Hedberg 1118a3d4e20aSJohan Hedberg list_del(&ie->list); 1119a3d4e20aSJohan Hedberg 1120a3d4e20aSJohan Hedberg list_for_each_entry(p, &cache->resolve, list) { 1121a3d4e20aSJohan Hedberg if (p->name_state != NAME_PENDING && 1122a3d4e20aSJohan Hedberg abs(p->data.rssi) >= abs(ie->data.rssi)) 1123a3d4e20aSJohan Hedberg break; 1124a3d4e20aSJohan Hedberg pos = &p->list; 1125a3d4e20aSJohan Hedberg } 1126a3d4e20aSJohan Hedberg 1127a3d4e20aSJohan Hedberg list_add(&ie->list, pos); 1128a3d4e20aSJohan Hedberg } 1129a3d4e20aSJohan Hedberg 1130af58925cSMarcel Holtmann u32 hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data, 1131af58925cSMarcel Holtmann bool name_known) 11321da177e4SLinus Torvalds { 113330883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 113470f23020SAndrei Emeltchenko struct inquiry_entry *ie; 1135af58925cSMarcel Holtmann u32 flags = 0; 11361da177e4SLinus Torvalds 11376ed93dc6SAndrei Emeltchenko BT_DBG("cache %p, %pMR", cache, &data->bdaddr); 11381da177e4SLinus Torvalds 11396928a924SJohan Hedberg hci_remove_remote_oob_data(hdev, &data->bdaddr, BDADDR_BREDR); 11402b2fec4dSSzymon Janc 1141af58925cSMarcel Holtmann if (!data->ssp_mode) 1142af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_LEGACY_PAIRING; 1143388fc8faSJohan Hedberg 114470f23020SAndrei Emeltchenko ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr); 1145a3d4e20aSJohan Hedberg if (ie) { 1146af58925cSMarcel Holtmann if (!ie->data.ssp_mode) 1147af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_LEGACY_PAIRING; 1148388fc8faSJohan Hedberg 1149a3d4e20aSJohan Hedberg if (ie->name_state == NAME_NEEDED && 1150a3d4e20aSJohan Hedberg data->rssi != ie->data.rssi) { 1151a3d4e20aSJohan Hedberg ie->data.rssi = data->rssi; 1152a3d4e20aSJohan Hedberg hci_inquiry_cache_update_resolve(hdev, ie); 1153a3d4e20aSJohan Hedberg } 1154a3d4e20aSJohan Hedberg 1155561aafbcSJohan Hedberg goto update; 1156a3d4e20aSJohan Hedberg } 1157561aafbcSJohan Hedberg 11581da177e4SLinus Torvalds /* Entry not in the cache. Add new one. */ 115927f70f3eSJohan Hedberg ie = kzalloc(sizeof(*ie), GFP_KERNEL); 1160af58925cSMarcel Holtmann if (!ie) { 1161af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_CONFIRM_NAME; 1162af58925cSMarcel Holtmann goto done; 1163af58925cSMarcel Holtmann } 116470f23020SAndrei Emeltchenko 1165561aafbcSJohan Hedberg list_add(&ie->all, &cache->all); 1166561aafbcSJohan Hedberg 1167561aafbcSJohan Hedberg if (name_known) { 1168561aafbcSJohan Hedberg ie->name_state = NAME_KNOWN; 1169561aafbcSJohan Hedberg } else { 1170561aafbcSJohan Hedberg ie->name_state = NAME_NOT_KNOWN; 1171561aafbcSJohan Hedberg list_add(&ie->list, &cache->unknown); 1172561aafbcSJohan Hedberg } 1173561aafbcSJohan Hedberg 1174561aafbcSJohan Hedberg update: 1175561aafbcSJohan Hedberg if (name_known && ie->name_state != NAME_KNOWN && 1176561aafbcSJohan Hedberg ie->name_state != NAME_PENDING) { 1177561aafbcSJohan Hedberg ie->name_state = NAME_KNOWN; 1178561aafbcSJohan Hedberg list_del(&ie->list); 11791da177e4SLinus Torvalds } 11801da177e4SLinus Torvalds 118170f23020SAndrei Emeltchenko memcpy(&ie->data, data, sizeof(*data)); 118270f23020SAndrei Emeltchenko ie->timestamp = jiffies; 11831da177e4SLinus Torvalds cache->timestamp = jiffies; 11843175405bSJohan Hedberg 11853175405bSJohan Hedberg if (ie->name_state == NAME_NOT_KNOWN) 1186af58925cSMarcel Holtmann flags |= MGMT_DEV_FOUND_CONFIRM_NAME; 11873175405bSJohan Hedberg 1188af58925cSMarcel Holtmann done: 1189af58925cSMarcel Holtmann return flags; 11901da177e4SLinus Torvalds } 11911da177e4SLinus Torvalds 11921da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf) 11931da177e4SLinus Torvalds { 119430883512SJohan Hedberg struct discovery_state *cache = &hdev->discovery; 11951da177e4SLinus Torvalds struct inquiry_info *info = (struct inquiry_info *) buf; 11961da177e4SLinus Torvalds struct inquiry_entry *e; 11971da177e4SLinus Torvalds int copied = 0; 11981da177e4SLinus Torvalds 1199561aafbcSJohan Hedberg list_for_each_entry(e, &cache->all, all) { 12001da177e4SLinus Torvalds struct inquiry_data *data = &e->data; 1201b57c1a56SJohan Hedberg 1202b57c1a56SJohan Hedberg if (copied >= num) 1203b57c1a56SJohan Hedberg break; 1204b57c1a56SJohan Hedberg 12051da177e4SLinus Torvalds bacpy(&info->bdaddr, &data->bdaddr); 12061da177e4SLinus Torvalds info->pscan_rep_mode = data->pscan_rep_mode; 12071da177e4SLinus Torvalds info->pscan_period_mode = data->pscan_period_mode; 12081da177e4SLinus Torvalds info->pscan_mode = data->pscan_mode; 12091da177e4SLinus Torvalds memcpy(info->dev_class, data->dev_class, 3); 12101da177e4SLinus Torvalds info->clock_offset = data->clock_offset; 1211b57c1a56SJohan Hedberg 12121da177e4SLinus Torvalds info++; 1213b57c1a56SJohan Hedberg copied++; 12141da177e4SLinus Torvalds } 12151da177e4SLinus Torvalds 12161da177e4SLinus Torvalds BT_DBG("cache %p, copied %d", cache, copied); 12171da177e4SLinus Torvalds return copied; 12181da177e4SLinus Torvalds } 12191da177e4SLinus Torvalds 122042c6b129SJohan Hedberg static void hci_inq_req(struct hci_request *req, unsigned long opt) 12211da177e4SLinus Torvalds { 12221da177e4SLinus Torvalds struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt; 122342c6b129SJohan Hedberg struct hci_dev *hdev = req->hdev; 12241da177e4SLinus Torvalds struct hci_cp_inquiry cp; 12251da177e4SLinus Torvalds 12261da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 12271da177e4SLinus Torvalds 12281da177e4SLinus Torvalds if (test_bit(HCI_INQUIRY, &hdev->flags)) 12291da177e4SLinus Torvalds return; 12301da177e4SLinus Torvalds 12311da177e4SLinus Torvalds /* Start Inquiry */ 12321da177e4SLinus Torvalds memcpy(&cp.lap, &ir->lap, 3); 12331da177e4SLinus Torvalds cp.length = ir->length; 12341da177e4SLinus Torvalds cp.num_rsp = ir->num_rsp; 123542c6b129SJohan Hedberg hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp); 12361da177e4SLinus Torvalds } 12371da177e4SLinus Torvalds 12381da177e4SLinus Torvalds int hci_inquiry(void __user *arg) 12391da177e4SLinus Torvalds { 12401da177e4SLinus Torvalds __u8 __user *ptr = arg; 12411da177e4SLinus Torvalds struct hci_inquiry_req ir; 12421da177e4SLinus Torvalds struct hci_dev *hdev; 12431da177e4SLinus Torvalds int err = 0, do_inquiry = 0, max_rsp; 12441da177e4SLinus Torvalds long timeo; 12451da177e4SLinus Torvalds __u8 *buf; 12461da177e4SLinus Torvalds 12471da177e4SLinus Torvalds if (copy_from_user(&ir, ptr, sizeof(ir))) 12481da177e4SLinus Torvalds return -EFAULT; 12491da177e4SLinus Torvalds 12505a08ecceSAndrei Emeltchenko hdev = hci_dev_get(ir.dev_id); 12515a08ecceSAndrei Emeltchenko if (!hdev) 12521da177e4SLinus Torvalds return -ENODEV; 12531da177e4SLinus Torvalds 1254d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 12550736cfa8SMarcel Holtmann err = -EBUSY; 12560736cfa8SMarcel Holtmann goto done; 12570736cfa8SMarcel Holtmann } 12580736cfa8SMarcel Holtmann 1259d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1260fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1261fee746b0SMarcel Holtmann goto done; 1262fee746b0SMarcel Holtmann } 1263fee746b0SMarcel Holtmann 12645b69bef5SMarcel Holtmann if (hdev->dev_type != HCI_BREDR) { 12655b69bef5SMarcel Holtmann err = -EOPNOTSUPP; 12665b69bef5SMarcel Holtmann goto done; 12675b69bef5SMarcel Holtmann } 12685b69bef5SMarcel Holtmann 1269d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { 127056f87901SJohan Hedberg err = -EOPNOTSUPP; 127156f87901SJohan Hedberg goto done; 127256f87901SJohan Hedberg } 127356f87901SJohan Hedberg 127409fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 12751da177e4SLinus Torvalds if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX || 1276a8c5fb1aSGustavo Padovan inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) { 12771f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 12781da177e4SLinus Torvalds do_inquiry = 1; 12791da177e4SLinus Torvalds } 128009fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 12811da177e4SLinus Torvalds 128204837f64SMarcel Holtmann timeo = ir.length * msecs_to_jiffies(2000); 128370f23020SAndrei Emeltchenko 128470f23020SAndrei Emeltchenko if (do_inquiry) { 128501178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir, 128601178cd4SJohan Hedberg timeo); 128770f23020SAndrei Emeltchenko if (err < 0) 12881da177e4SLinus Torvalds goto done; 12893e13fa1eSAndre Guedes 12903e13fa1eSAndre Guedes /* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is 12913e13fa1eSAndre Guedes * cleared). If it is interrupted by a signal, return -EINTR. 12923e13fa1eSAndre Guedes */ 129374316201SNeilBrown if (wait_on_bit(&hdev->flags, HCI_INQUIRY, 12943e13fa1eSAndre Guedes TASK_INTERRUPTIBLE)) 12953e13fa1eSAndre Guedes return -EINTR; 129670f23020SAndrei Emeltchenko } 12971da177e4SLinus Torvalds 12988fc9ced3SGustavo Padovan /* for unlimited number of responses we will use buffer with 12998fc9ced3SGustavo Padovan * 255 entries 13008fc9ced3SGustavo Padovan */ 13011da177e4SLinus Torvalds max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp; 13021da177e4SLinus Torvalds 13031da177e4SLinus Torvalds /* cache_dump can't sleep. Therefore we allocate temp buffer and then 13041da177e4SLinus Torvalds * copy it to the user space. 13051da177e4SLinus Torvalds */ 130670f23020SAndrei Emeltchenko buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL); 130770f23020SAndrei Emeltchenko if (!buf) { 13081da177e4SLinus Torvalds err = -ENOMEM; 13091da177e4SLinus Torvalds goto done; 13101da177e4SLinus Torvalds } 13111da177e4SLinus Torvalds 131209fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 13131da177e4SLinus Torvalds ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf); 131409fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 13151da177e4SLinus Torvalds 13161da177e4SLinus Torvalds BT_DBG("num_rsp %d", ir.num_rsp); 13171da177e4SLinus Torvalds 13181da177e4SLinus Torvalds if (!copy_to_user(ptr, &ir, sizeof(ir))) { 13191da177e4SLinus Torvalds ptr += sizeof(ir); 13201da177e4SLinus Torvalds if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) * 13211da177e4SLinus Torvalds ir.num_rsp)) 13221da177e4SLinus Torvalds err = -EFAULT; 13231da177e4SLinus Torvalds } else 13241da177e4SLinus Torvalds err = -EFAULT; 13251da177e4SLinus Torvalds 13261da177e4SLinus Torvalds kfree(buf); 13271da177e4SLinus Torvalds 13281da177e4SLinus Torvalds done: 13291da177e4SLinus Torvalds hci_dev_put(hdev); 13301da177e4SLinus Torvalds return err; 13311da177e4SLinus Torvalds } 13321da177e4SLinus Torvalds 1333cbed0ca1SJohan Hedberg static int hci_dev_do_open(struct hci_dev *hdev) 13341da177e4SLinus Torvalds { 13351da177e4SLinus Torvalds int ret = 0; 13361da177e4SLinus Torvalds 13371da177e4SLinus Torvalds BT_DBG("%s %p", hdev->name, hdev); 13381da177e4SLinus Torvalds 13391da177e4SLinus Torvalds hci_req_lock(hdev); 13401da177e4SLinus Torvalds 1341d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) { 134294324962SJohan Hovold ret = -ENODEV; 134394324962SJohan Hovold goto done; 134494324962SJohan Hovold } 134594324962SJohan Hovold 1346d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 1347d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) { 1348a5c8f270SMarcel Holtmann /* Check for rfkill but allow the HCI setup stage to 1349a5c8f270SMarcel Holtmann * proceed (which in itself doesn't cause any RF activity). 1350bf543036SJohan Hedberg */ 1351d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_RFKILLED)) { 1352611b30f7SMarcel Holtmann ret = -ERFKILL; 1353611b30f7SMarcel Holtmann goto done; 1354611b30f7SMarcel Holtmann } 1355611b30f7SMarcel Holtmann 1356a5c8f270SMarcel Holtmann /* Check for valid public address or a configured static 1357a5c8f270SMarcel Holtmann * random adddress, but let the HCI setup proceed to 1358a5c8f270SMarcel Holtmann * be able to determine if there is a public address 1359a5c8f270SMarcel Holtmann * or not. 1360a5c8f270SMarcel Holtmann * 1361c6beca0eSMarcel Holtmann * In case of user channel usage, it is not important 1362c6beca0eSMarcel Holtmann * if a public address or static random address is 1363c6beca0eSMarcel Holtmann * available. 1364c6beca0eSMarcel Holtmann * 1365a5c8f270SMarcel Holtmann * This check is only valid for BR/EDR controllers 1366a5c8f270SMarcel Holtmann * since AMP controllers do not have an address. 1367a5c8f270SMarcel Holtmann */ 1368d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 1369c6beca0eSMarcel Holtmann hdev->dev_type == HCI_BREDR && 1370a5c8f270SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) && 1371a5c8f270SMarcel Holtmann !bacmp(&hdev->static_addr, BDADDR_ANY)) { 1372a5c8f270SMarcel Holtmann ret = -EADDRNOTAVAIL; 1373a5c8f270SMarcel Holtmann goto done; 1374a5c8f270SMarcel Holtmann } 1375a5c8f270SMarcel Holtmann } 1376a5c8f270SMarcel Holtmann 13771da177e4SLinus Torvalds if (test_bit(HCI_UP, &hdev->flags)) { 13781da177e4SLinus Torvalds ret = -EALREADY; 13791da177e4SLinus Torvalds goto done; 13801da177e4SLinus Torvalds } 13811da177e4SLinus Torvalds 13821da177e4SLinus Torvalds if (hdev->open(hdev)) { 13831da177e4SLinus Torvalds ret = -EIO; 13841da177e4SLinus Torvalds goto done; 13851da177e4SLinus Torvalds } 13861da177e4SLinus Torvalds 13871da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 13881da177e4SLinus Torvalds set_bit(HCI_INIT, &hdev->flags); 1389f41c70c4SMarcel Holtmann 1390d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_SETUP)) { 1391af202f84SMarcel Holtmann if (hdev->setup) 1392f41c70c4SMarcel Holtmann ret = hdev->setup(hdev); 1393f41c70c4SMarcel Holtmann 1394af202f84SMarcel Holtmann /* The transport driver can set these quirks before 1395af202f84SMarcel Holtmann * creating the HCI device or in its setup callback. 1396af202f84SMarcel Holtmann * 1397af202f84SMarcel Holtmann * In case any of them is set, the controller has to 1398af202f84SMarcel Holtmann * start up as unconfigured. 1399af202f84SMarcel Holtmann */ 1400eb1904f4SMarcel Holtmann if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || 1401eb1904f4SMarcel Holtmann test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks)) 1402a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNCONFIGURED); 1403f41c70c4SMarcel Holtmann 14040ebca7d6SMarcel Holtmann /* For an unconfigured controller it is required to 14050ebca7d6SMarcel Holtmann * read at least the version information provided by 14060ebca7d6SMarcel Holtmann * the Read Local Version Information command. 14070ebca7d6SMarcel Holtmann * 14080ebca7d6SMarcel Holtmann * If the set_bdaddr driver callback is provided, then 14090ebca7d6SMarcel Holtmann * also the original Bluetooth public device address 14100ebca7d6SMarcel Holtmann * will be read using the Read BD Address command. 14110ebca7d6SMarcel Holtmann */ 1412d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 14130ebca7d6SMarcel Holtmann ret = __hci_unconf_init(hdev); 141489bc22d2SMarcel Holtmann } 141589bc22d2SMarcel Holtmann 1416d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_CONFIG)) { 14179713c17bSMarcel Holtmann /* If public address change is configured, ensure that 14189713c17bSMarcel Holtmann * the address gets programmed. If the driver does not 14199713c17bSMarcel Holtmann * support changing the public address, fail the power 14209713c17bSMarcel Holtmann * on procedure. 142124c457e2SMarcel Holtmann */ 14229713c17bSMarcel Holtmann if (bacmp(&hdev->public_addr, BDADDR_ANY) && 14239713c17bSMarcel Holtmann hdev->set_bdaddr) 142424c457e2SMarcel Holtmann ret = hdev->set_bdaddr(hdev, &hdev->public_addr); 142524c457e2SMarcel Holtmann else 142624c457e2SMarcel Holtmann ret = -EADDRNOTAVAIL; 142724c457e2SMarcel Holtmann } 142824c457e2SMarcel Holtmann 1429f41c70c4SMarcel Holtmann if (!ret) { 1430d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1431d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) 14322177bab5SJohan Hedberg ret = __hci_init(hdev); 14331da177e4SLinus Torvalds } 14341da177e4SLinus Torvalds 1435f41c70c4SMarcel Holtmann clear_bit(HCI_INIT, &hdev->flags); 1436f41c70c4SMarcel Holtmann 14371da177e4SLinus Torvalds if (!ret) { 14381da177e4SLinus Torvalds hci_dev_hold(hdev); 1439a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); 14401da177e4SLinus Torvalds set_bit(HCI_UP, &hdev->flags); 14411da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_UP); 1442d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 1443d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG) && 1444d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1445d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 14461514b892SMarcel Holtmann hdev->dev_type == HCI_BREDR) { 144709fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 1448744cf19eSJohan Hedberg mgmt_powered(hdev, 1); 144909fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 145056e5cb86SJohan Hedberg } 14511da177e4SLinus Torvalds } else { 14521da177e4SLinus Torvalds /* Init failed, cleanup */ 14533eff45eaSGustavo F. Padovan flush_work(&hdev->tx_work); 1454c347b765SGustavo F. Padovan flush_work(&hdev->cmd_work); 1455b78752ccSMarcel Holtmann flush_work(&hdev->rx_work); 14561da177e4SLinus Torvalds 14571da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 14581da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 14591da177e4SLinus Torvalds 14601da177e4SLinus Torvalds if (hdev->flush) 14611da177e4SLinus Torvalds hdev->flush(hdev); 14621da177e4SLinus Torvalds 14631da177e4SLinus Torvalds if (hdev->sent_cmd) { 14641da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 14651da177e4SLinus Torvalds hdev->sent_cmd = NULL; 14661da177e4SLinus Torvalds } 14671da177e4SLinus Torvalds 14681da177e4SLinus Torvalds hdev->close(hdev); 1469fee746b0SMarcel Holtmann hdev->flags &= BIT(HCI_RAW); 14701da177e4SLinus Torvalds } 14711da177e4SLinus Torvalds 14721da177e4SLinus Torvalds done: 14731da177e4SLinus Torvalds hci_req_unlock(hdev); 14741da177e4SLinus Torvalds return ret; 14751da177e4SLinus Torvalds } 14761da177e4SLinus Torvalds 1477cbed0ca1SJohan Hedberg /* ---- HCI ioctl helpers ---- */ 1478cbed0ca1SJohan Hedberg 1479cbed0ca1SJohan Hedberg int hci_dev_open(__u16 dev) 1480cbed0ca1SJohan Hedberg { 1481cbed0ca1SJohan Hedberg struct hci_dev *hdev; 1482cbed0ca1SJohan Hedberg int err; 1483cbed0ca1SJohan Hedberg 1484cbed0ca1SJohan Hedberg hdev = hci_dev_get(dev); 1485cbed0ca1SJohan Hedberg if (!hdev) 1486cbed0ca1SJohan Hedberg return -ENODEV; 1487cbed0ca1SJohan Hedberg 14884a964404SMarcel Holtmann /* Devices that are marked as unconfigured can only be powered 1489fee746b0SMarcel Holtmann * up as user channel. Trying to bring them up as normal devices 1490fee746b0SMarcel Holtmann * will result into a failure. Only user channel operation is 1491fee746b0SMarcel Holtmann * possible. 1492fee746b0SMarcel Holtmann * 1493fee746b0SMarcel Holtmann * When this function is called for a user channel, the flag 1494fee746b0SMarcel Holtmann * HCI_USER_CHANNEL will be set first before attempting to 1495fee746b0SMarcel Holtmann * open the device. 1496fee746b0SMarcel Holtmann */ 1497d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1498d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 1499fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1500fee746b0SMarcel Holtmann goto done; 1501fee746b0SMarcel Holtmann } 1502fee746b0SMarcel Holtmann 1503e1d08f40SJohan Hedberg /* We need to ensure that no other power on/off work is pending 1504e1d08f40SJohan Hedberg * before proceeding to call hci_dev_do_open. This is 1505e1d08f40SJohan Hedberg * particularly important if the setup procedure has not yet 1506e1d08f40SJohan Hedberg * completed. 1507e1d08f40SJohan Hedberg */ 1508a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) 1509e1d08f40SJohan Hedberg cancel_delayed_work(&hdev->power_off); 1510e1d08f40SJohan Hedberg 1511a5c8f270SMarcel Holtmann /* After this call it is guaranteed that the setup procedure 1512a5c8f270SMarcel Holtmann * has finished. This means that error conditions like RFKILL 1513a5c8f270SMarcel Holtmann * or no valid public or static random address apply. 1514a5c8f270SMarcel Holtmann */ 1515e1d08f40SJohan Hedberg flush_workqueue(hdev->req_workqueue); 1516e1d08f40SJohan Hedberg 151712aa4f0aSMarcel Holtmann /* For controllers not using the management interface and that 1518b6ae8457SJohan Hedberg * are brought up using legacy ioctl, set the HCI_BONDABLE bit 151912aa4f0aSMarcel Holtmann * so that pairing works for them. Once the management interface 152012aa4f0aSMarcel Holtmann * is in use this bit will be cleared again and userspace has 152112aa4f0aSMarcel Holtmann * to explicitly enable it. 152212aa4f0aSMarcel Holtmann */ 1523d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 1524d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_MGMT)) 1525a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BONDABLE); 152612aa4f0aSMarcel Holtmann 1527cbed0ca1SJohan Hedberg err = hci_dev_do_open(hdev); 1528cbed0ca1SJohan Hedberg 1529fee746b0SMarcel Holtmann done: 1530cbed0ca1SJohan Hedberg hci_dev_put(hdev); 1531cbed0ca1SJohan Hedberg return err; 1532cbed0ca1SJohan Hedberg } 1533cbed0ca1SJohan Hedberg 1534d7347f3cSJohan Hedberg /* This function requires the caller holds hdev->lock */ 1535d7347f3cSJohan Hedberg static void hci_pend_le_actions_clear(struct hci_dev *hdev) 1536d7347f3cSJohan Hedberg { 1537d7347f3cSJohan Hedberg struct hci_conn_params *p; 1538d7347f3cSJohan Hedberg 1539f161dd41SJohan Hedberg list_for_each_entry(p, &hdev->le_conn_params, list) { 1540f161dd41SJohan Hedberg if (p->conn) { 1541f161dd41SJohan Hedberg hci_conn_drop(p->conn); 1542f8aaf9b6SJohan Hedberg hci_conn_put(p->conn); 1543f161dd41SJohan Hedberg p->conn = NULL; 1544f161dd41SJohan Hedberg } 1545d7347f3cSJohan Hedberg list_del_init(&p->action); 1546f161dd41SJohan Hedberg } 1547d7347f3cSJohan Hedberg 1548d7347f3cSJohan Hedberg BT_DBG("All LE pending actions cleared"); 1549d7347f3cSJohan Hedberg } 1550d7347f3cSJohan Hedberg 15511da177e4SLinus Torvalds static int hci_dev_do_close(struct hci_dev *hdev) 15521da177e4SLinus Torvalds { 15531da177e4SLinus Torvalds BT_DBG("%s %p", hdev->name, hdev); 15541da177e4SLinus Torvalds 1555d24d8144SGabriele Mazzotta if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) && 1556867146a0SLoic Poulain !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && 1557d24d8144SGabriele Mazzotta test_bit(HCI_UP, &hdev->flags)) { 1558a44fecbdSTedd Ho-Jeong An /* Execute vendor specific shutdown routine */ 1559a44fecbdSTedd Ho-Jeong An if (hdev->shutdown) 1560a44fecbdSTedd Ho-Jeong An hdev->shutdown(hdev); 1561a44fecbdSTedd Ho-Jeong An } 1562a44fecbdSTedd Ho-Jeong An 156378c04c0bSVinicius Costa Gomes cancel_delayed_work(&hdev->power_off); 156478c04c0bSVinicius Costa Gomes 15651da177e4SLinus Torvalds hci_req_cancel(hdev, ENODEV); 15661da177e4SLinus Torvalds hci_req_lock(hdev); 15671da177e4SLinus Torvalds 15681da177e4SLinus Torvalds if (!test_and_clear_bit(HCI_UP, &hdev->flags)) { 156965cc2b49SMarcel Holtmann cancel_delayed_work_sync(&hdev->cmd_timer); 15701da177e4SLinus Torvalds hci_req_unlock(hdev); 15711da177e4SLinus Torvalds return 0; 15721da177e4SLinus Torvalds } 15731da177e4SLinus Torvalds 15743eff45eaSGustavo F. Padovan /* Flush RX and TX works */ 15753eff45eaSGustavo F. Padovan flush_work(&hdev->tx_work); 1576b78752ccSMarcel Holtmann flush_work(&hdev->rx_work); 15771da177e4SLinus Torvalds 157816ab91abSJohan Hedberg if (hdev->discov_timeout > 0) { 1579e0f9309fSJohan Hedberg cancel_delayed_work(&hdev->discov_off); 158016ab91abSJohan Hedberg hdev->discov_timeout = 0; 1581a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); 1582a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); 158316ab91abSJohan Hedberg } 158416ab91abSJohan Hedberg 1585a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) 15867d78525dSJohan Hedberg cancel_delayed_work(&hdev->service_cache); 15877d78525dSJohan Hedberg 15887ba8b4beSAndre Guedes cancel_delayed_work_sync(&hdev->le_scan_disable); 15892d28cfe7SJakub Pawlowski cancel_delayed_work_sync(&hdev->le_scan_restart); 15904518bb0fSJohan Hedberg 1591d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_MGMT)) 1592d6bfd59cSJohan Hedberg cancel_delayed_work_sync(&hdev->rpa_expired); 15937ba8b4beSAndre Guedes 15945d900e46SFlorian Grandel if (hdev->adv_instance_timeout) { 15955d900e46SFlorian Grandel cancel_delayed_work_sync(&hdev->adv_instance_expire); 15965d900e46SFlorian Grandel hdev->adv_instance_timeout = 0; 15975d900e46SFlorian Grandel } 15985d900e46SFlorian Grandel 159976727c02SJohan Hedberg /* Avoid potential lockdep warnings from the *_flush() calls by 160076727c02SJohan Hedberg * ensuring the workqueue is empty up front. 160176727c02SJohan Hedberg */ 160276727c02SJohan Hedberg drain_workqueue(hdev->workqueue); 160376727c02SJohan Hedberg 160409fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 16051aeb9c65SJohan Hedberg 16068f502f84SJohan Hedberg hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 16078f502f84SJohan Hedberg 1608a69d8927SMarcel Holtmann if (!hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) { 16091aeb9c65SJohan Hedberg if (hdev->dev_type == HCI_BREDR) 16101aeb9c65SJohan Hedberg mgmt_powered(hdev, 0); 16111aeb9c65SJohan Hedberg } 16121aeb9c65SJohan Hedberg 16131f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 1614d7347f3cSJohan Hedberg hci_pend_le_actions_clear(hdev); 1615f161dd41SJohan Hedberg hci_conn_hash_flush(hdev); 161609fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 16171da177e4SLinus Torvalds 161864dae967SMarcel Holtmann smp_unregister(hdev); 161964dae967SMarcel Holtmann 16201da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_DOWN); 16211da177e4SLinus Torvalds 16221da177e4SLinus Torvalds if (hdev->flush) 16231da177e4SLinus Torvalds hdev->flush(hdev); 16241da177e4SLinus Torvalds 16251da177e4SLinus Torvalds /* Reset device */ 16261da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 16271da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 1628d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_AUTO_OFF) && 1629d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_UNCONFIGURED) && 1630a6c511c6SSzymon Janc test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) { 16311da177e4SLinus Torvalds set_bit(HCI_INIT, &hdev->flags); 163201178cd4SJohan Hedberg __hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT); 16331da177e4SLinus Torvalds clear_bit(HCI_INIT, &hdev->flags); 16341da177e4SLinus Torvalds } 16351da177e4SLinus Torvalds 1636c347b765SGustavo F. Padovan /* flush cmd work */ 1637c347b765SGustavo F. Padovan flush_work(&hdev->cmd_work); 16381da177e4SLinus Torvalds 16391da177e4SLinus Torvalds /* Drop queues */ 16401da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 16411da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 16421da177e4SLinus Torvalds skb_queue_purge(&hdev->raw_q); 16431da177e4SLinus Torvalds 16441da177e4SLinus Torvalds /* Drop last sent command */ 16451da177e4SLinus Torvalds if (hdev->sent_cmd) { 164665cc2b49SMarcel Holtmann cancel_delayed_work_sync(&hdev->cmd_timer); 16471da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 16481da177e4SLinus Torvalds hdev->sent_cmd = NULL; 16491da177e4SLinus Torvalds } 16501da177e4SLinus Torvalds 16511da177e4SLinus Torvalds /* After this point our queues are empty 16521da177e4SLinus Torvalds * and no tasks are scheduled. */ 16531da177e4SLinus Torvalds hdev->close(hdev); 16541da177e4SLinus Torvalds 165535b973c9SJohan Hedberg /* Clear flags */ 1656fee746b0SMarcel Holtmann hdev->flags &= BIT(HCI_RAW); 1657eacb44dfSMarcel Holtmann hci_dev_clear_volatile_flags(hdev); 165835b973c9SJohan Hedberg 1659ced5c338SAndrei Emeltchenko /* Controller radio is available but is currently powered down */ 1660536619e8SMarcel Holtmann hdev->amp_status = AMP_STATUS_POWERED_DOWN; 1661ced5c338SAndrei Emeltchenko 1662e59fda8dSJohan Hedberg memset(hdev->eir, 0, sizeof(hdev->eir)); 166309b3c3fbSJohan Hedberg memset(hdev->dev_class, 0, sizeof(hdev->dev_class)); 16647a4cd51dSMarcel Holtmann bacpy(&hdev->random_addr, BDADDR_ANY); 1665e59fda8dSJohan Hedberg 16661da177e4SLinus Torvalds hci_req_unlock(hdev); 16671da177e4SLinus Torvalds 16681da177e4SLinus Torvalds hci_dev_put(hdev); 16691da177e4SLinus Torvalds return 0; 16701da177e4SLinus Torvalds } 16711da177e4SLinus Torvalds 16721da177e4SLinus Torvalds int hci_dev_close(__u16 dev) 16731da177e4SLinus Torvalds { 16741da177e4SLinus Torvalds struct hci_dev *hdev; 16751da177e4SLinus Torvalds int err; 16761da177e4SLinus Torvalds 167770f23020SAndrei Emeltchenko hdev = hci_dev_get(dev); 167870f23020SAndrei Emeltchenko if (!hdev) 16791da177e4SLinus Torvalds return -ENODEV; 16808ee56540SMarcel Holtmann 1681d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 16820736cfa8SMarcel Holtmann err = -EBUSY; 16830736cfa8SMarcel Holtmann goto done; 16840736cfa8SMarcel Holtmann } 16850736cfa8SMarcel Holtmann 1686a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) 16878ee56540SMarcel Holtmann cancel_delayed_work(&hdev->power_off); 16888ee56540SMarcel Holtmann 16891da177e4SLinus Torvalds err = hci_dev_do_close(hdev); 16908ee56540SMarcel Holtmann 16910736cfa8SMarcel Holtmann done: 16921da177e4SLinus Torvalds hci_dev_put(hdev); 16931da177e4SLinus Torvalds return err; 16941da177e4SLinus Torvalds } 16951da177e4SLinus Torvalds 16965c912495SMarcel Holtmann static int hci_dev_do_reset(struct hci_dev *hdev) 16971da177e4SLinus Torvalds { 16985c912495SMarcel Holtmann int ret; 16991da177e4SLinus Torvalds 17005c912495SMarcel Holtmann BT_DBG("%s %p", hdev->name, hdev); 17011da177e4SLinus Torvalds 17021da177e4SLinus Torvalds hci_req_lock(hdev); 17031da177e4SLinus Torvalds 17041da177e4SLinus Torvalds /* Drop queues */ 17051da177e4SLinus Torvalds skb_queue_purge(&hdev->rx_q); 17061da177e4SLinus Torvalds skb_queue_purge(&hdev->cmd_q); 17071da177e4SLinus Torvalds 170876727c02SJohan Hedberg /* Avoid potential lockdep warnings from the *_flush() calls by 170976727c02SJohan Hedberg * ensuring the workqueue is empty up front. 171076727c02SJohan Hedberg */ 171176727c02SJohan Hedberg drain_workqueue(hdev->workqueue); 171276727c02SJohan Hedberg 171309fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 17141f9b9a5dSAndre Guedes hci_inquiry_cache_flush(hdev); 17151da177e4SLinus Torvalds hci_conn_hash_flush(hdev); 171609fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 17171da177e4SLinus Torvalds 17181da177e4SLinus Torvalds if (hdev->flush) 17191da177e4SLinus Torvalds hdev->flush(hdev); 17201da177e4SLinus Torvalds 17211da177e4SLinus Torvalds atomic_set(&hdev->cmd_cnt, 1); 17226ed58ec5SVille Tervo hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0; 17231da177e4SLinus Torvalds 172401178cd4SJohan Hedberg ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT); 17251da177e4SLinus Torvalds 17261da177e4SLinus Torvalds hci_req_unlock(hdev); 17271da177e4SLinus Torvalds return ret; 17281da177e4SLinus Torvalds } 17291da177e4SLinus Torvalds 17305c912495SMarcel Holtmann int hci_dev_reset(__u16 dev) 17315c912495SMarcel Holtmann { 17325c912495SMarcel Holtmann struct hci_dev *hdev; 17335c912495SMarcel Holtmann int err; 17345c912495SMarcel Holtmann 17355c912495SMarcel Holtmann hdev = hci_dev_get(dev); 17365c912495SMarcel Holtmann if (!hdev) 17375c912495SMarcel Holtmann return -ENODEV; 17385c912495SMarcel Holtmann 17395c912495SMarcel Holtmann if (!test_bit(HCI_UP, &hdev->flags)) { 17405c912495SMarcel Holtmann err = -ENETDOWN; 17415c912495SMarcel Holtmann goto done; 17425c912495SMarcel Holtmann } 17435c912495SMarcel Holtmann 1744d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 17455c912495SMarcel Holtmann err = -EBUSY; 17465c912495SMarcel Holtmann goto done; 17475c912495SMarcel Holtmann } 17485c912495SMarcel Holtmann 1749d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 17505c912495SMarcel Holtmann err = -EOPNOTSUPP; 17515c912495SMarcel Holtmann goto done; 17525c912495SMarcel Holtmann } 17535c912495SMarcel Holtmann 17545c912495SMarcel Holtmann err = hci_dev_do_reset(hdev); 17555c912495SMarcel Holtmann 17565c912495SMarcel Holtmann done: 17575c912495SMarcel Holtmann hci_dev_put(hdev); 17585c912495SMarcel Holtmann return err; 17595c912495SMarcel Holtmann } 17605c912495SMarcel Holtmann 17611da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev) 17621da177e4SLinus Torvalds { 17631da177e4SLinus Torvalds struct hci_dev *hdev; 17641da177e4SLinus Torvalds int ret = 0; 17651da177e4SLinus Torvalds 176670f23020SAndrei Emeltchenko hdev = hci_dev_get(dev); 176770f23020SAndrei Emeltchenko if (!hdev) 17681da177e4SLinus Torvalds return -ENODEV; 17691da177e4SLinus Torvalds 1770d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 17710736cfa8SMarcel Holtmann ret = -EBUSY; 17720736cfa8SMarcel Holtmann goto done; 17730736cfa8SMarcel Holtmann } 17740736cfa8SMarcel Holtmann 1775d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1776fee746b0SMarcel Holtmann ret = -EOPNOTSUPP; 1777fee746b0SMarcel Holtmann goto done; 1778fee746b0SMarcel Holtmann } 1779fee746b0SMarcel Holtmann 17801da177e4SLinus Torvalds memset(&hdev->stat, 0, sizeof(struct hci_dev_stats)); 17811da177e4SLinus Torvalds 17820736cfa8SMarcel Holtmann done: 17831da177e4SLinus Torvalds hci_dev_put(hdev); 17841da177e4SLinus Torvalds return ret; 17851da177e4SLinus Torvalds } 17861da177e4SLinus Torvalds 1787123abc08SJohan Hedberg static void hci_update_scan_state(struct hci_dev *hdev, u8 scan) 1788123abc08SJohan Hedberg { 1789bc6d2d04SJohan Hedberg bool conn_changed, discov_changed; 1790123abc08SJohan Hedberg 1791123abc08SJohan Hedberg BT_DBG("%s scan 0x%02x", hdev->name, scan); 1792123abc08SJohan Hedberg 1793123abc08SJohan Hedberg if ((scan & SCAN_PAGE)) 1794238be788SMarcel Holtmann conn_changed = !hci_dev_test_and_set_flag(hdev, 1795238be788SMarcel Holtmann HCI_CONNECTABLE); 1796123abc08SJohan Hedberg else 1797a69d8927SMarcel Holtmann conn_changed = hci_dev_test_and_clear_flag(hdev, 1798a69d8927SMarcel Holtmann HCI_CONNECTABLE); 1799123abc08SJohan Hedberg 1800bc6d2d04SJohan Hedberg if ((scan & SCAN_INQUIRY)) { 1801238be788SMarcel Holtmann discov_changed = !hci_dev_test_and_set_flag(hdev, 1802238be788SMarcel Holtmann HCI_DISCOVERABLE); 1803bc6d2d04SJohan Hedberg } else { 1804a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); 1805a69d8927SMarcel Holtmann discov_changed = hci_dev_test_and_clear_flag(hdev, 1806a69d8927SMarcel Holtmann HCI_DISCOVERABLE); 1807bc6d2d04SJohan Hedberg } 1808bc6d2d04SJohan Hedberg 1809d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_MGMT)) 1810123abc08SJohan Hedberg return; 1811123abc08SJohan Hedberg 1812bc6d2d04SJohan Hedberg if (conn_changed || discov_changed) { 1813bc6d2d04SJohan Hedberg /* In case this was disabled through mgmt */ 1814a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); 1815bc6d2d04SJohan Hedberg 1816d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) 1817bc6d2d04SJohan Hedberg mgmt_update_adv_data(hdev); 1818bc6d2d04SJohan Hedberg 1819123abc08SJohan Hedberg mgmt_new_settings(hdev); 1820123abc08SJohan Hedberg } 1821bc6d2d04SJohan Hedberg } 1822123abc08SJohan Hedberg 18231da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg) 18241da177e4SLinus Torvalds { 18251da177e4SLinus Torvalds struct hci_dev *hdev; 18261da177e4SLinus Torvalds struct hci_dev_req dr; 18271da177e4SLinus Torvalds int err = 0; 18281da177e4SLinus Torvalds 18291da177e4SLinus Torvalds if (copy_from_user(&dr, arg, sizeof(dr))) 18301da177e4SLinus Torvalds return -EFAULT; 18311da177e4SLinus Torvalds 183270f23020SAndrei Emeltchenko hdev = hci_dev_get(dr.dev_id); 183370f23020SAndrei Emeltchenko if (!hdev) 18341da177e4SLinus Torvalds return -ENODEV; 18351da177e4SLinus Torvalds 1836d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 18370736cfa8SMarcel Holtmann err = -EBUSY; 18380736cfa8SMarcel Holtmann goto done; 18390736cfa8SMarcel Holtmann } 18400736cfa8SMarcel Holtmann 1841d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 1842fee746b0SMarcel Holtmann err = -EOPNOTSUPP; 1843fee746b0SMarcel Holtmann goto done; 1844fee746b0SMarcel Holtmann } 1845fee746b0SMarcel Holtmann 18465b69bef5SMarcel Holtmann if (hdev->dev_type != HCI_BREDR) { 18475b69bef5SMarcel Holtmann err = -EOPNOTSUPP; 18485b69bef5SMarcel Holtmann goto done; 18495b69bef5SMarcel Holtmann } 18505b69bef5SMarcel Holtmann 1851d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { 185256f87901SJohan Hedberg err = -EOPNOTSUPP; 185356f87901SJohan Hedberg goto done; 185456f87901SJohan Hedberg } 185556f87901SJohan Hedberg 18561da177e4SLinus Torvalds switch (cmd) { 18571da177e4SLinus Torvalds case HCISETAUTH: 185801178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt, 18595f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 18601da177e4SLinus Torvalds break; 18611da177e4SLinus Torvalds 18621da177e4SLinus Torvalds case HCISETENCRYPT: 18631da177e4SLinus Torvalds if (!lmp_encrypt_capable(hdev)) { 18641da177e4SLinus Torvalds err = -EOPNOTSUPP; 18651da177e4SLinus Torvalds break; 18661da177e4SLinus Torvalds } 18671da177e4SLinus Torvalds 18681da177e4SLinus Torvalds if (!test_bit(HCI_AUTH, &hdev->flags)) { 18691da177e4SLinus Torvalds /* Auth must be enabled first */ 187001178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt, 18715f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 18721da177e4SLinus Torvalds if (err) 18731da177e4SLinus Torvalds break; 18741da177e4SLinus Torvalds } 18751da177e4SLinus Torvalds 187601178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt, 18775f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 18781da177e4SLinus Torvalds break; 18791da177e4SLinus Torvalds 18801da177e4SLinus Torvalds case HCISETSCAN: 188101178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt, 18825f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 188391a668b0SJohan Hedberg 1884bc6d2d04SJohan Hedberg /* Ensure that the connectable and discoverable states 1885bc6d2d04SJohan Hedberg * get correctly modified as this was a non-mgmt change. 188691a668b0SJohan Hedberg */ 1887123abc08SJohan Hedberg if (!err) 1888123abc08SJohan Hedberg hci_update_scan_state(hdev, dr.dev_opt); 18891da177e4SLinus Torvalds break; 18901da177e4SLinus Torvalds 18911da177e4SLinus Torvalds case HCISETLINKPOL: 189201178cd4SJohan Hedberg err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt, 18935f246e89SAndrei Emeltchenko HCI_INIT_TIMEOUT); 18941da177e4SLinus Torvalds break; 18951da177e4SLinus Torvalds 18961da177e4SLinus Torvalds case HCISETLINKMODE: 1897e4e8e37cSMarcel Holtmann hdev->link_mode = ((__u16) dr.dev_opt) & 1898e4e8e37cSMarcel Holtmann (HCI_LM_MASTER | HCI_LM_ACCEPT); 1899e4e8e37cSMarcel Holtmann break; 1900e4e8e37cSMarcel Holtmann 1901e4e8e37cSMarcel Holtmann case HCISETPTYPE: 1902e4e8e37cSMarcel Holtmann hdev->pkt_type = (__u16) dr.dev_opt; 19031da177e4SLinus Torvalds break; 19041da177e4SLinus Torvalds 19051da177e4SLinus Torvalds case HCISETACLMTU: 19061da177e4SLinus Torvalds hdev->acl_mtu = *((__u16 *) &dr.dev_opt + 1); 19071da177e4SLinus Torvalds hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0); 19081da177e4SLinus Torvalds break; 19091da177e4SLinus Torvalds 19101da177e4SLinus Torvalds case HCISETSCOMTU: 19111da177e4SLinus Torvalds hdev->sco_mtu = *((__u16 *) &dr.dev_opt + 1); 19121da177e4SLinus Torvalds hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0); 19131da177e4SLinus Torvalds break; 19141da177e4SLinus Torvalds 19151da177e4SLinus Torvalds default: 19161da177e4SLinus Torvalds err = -EINVAL; 19171da177e4SLinus Torvalds break; 19181da177e4SLinus Torvalds } 1919e4e8e37cSMarcel Holtmann 19200736cfa8SMarcel Holtmann done: 19211da177e4SLinus Torvalds hci_dev_put(hdev); 19221da177e4SLinus Torvalds return err; 19231da177e4SLinus Torvalds } 19241da177e4SLinus Torvalds 19251da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg) 19261da177e4SLinus Torvalds { 19278035ded4SLuiz Augusto von Dentz struct hci_dev *hdev; 19281da177e4SLinus Torvalds struct hci_dev_list_req *dl; 19291da177e4SLinus Torvalds struct hci_dev_req *dr; 19301da177e4SLinus Torvalds int n = 0, size, err; 19311da177e4SLinus Torvalds __u16 dev_num; 19321da177e4SLinus Torvalds 19331da177e4SLinus Torvalds if (get_user(dev_num, (__u16 __user *) arg)) 19341da177e4SLinus Torvalds return -EFAULT; 19351da177e4SLinus Torvalds 19361da177e4SLinus Torvalds if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr)) 19371da177e4SLinus Torvalds return -EINVAL; 19381da177e4SLinus Torvalds 19391da177e4SLinus Torvalds size = sizeof(*dl) + dev_num * sizeof(*dr); 19401da177e4SLinus Torvalds 194170f23020SAndrei Emeltchenko dl = kzalloc(size, GFP_KERNEL); 194270f23020SAndrei Emeltchenko if (!dl) 19431da177e4SLinus Torvalds return -ENOMEM; 19441da177e4SLinus Torvalds 19451da177e4SLinus Torvalds dr = dl->dev_req; 19461da177e4SLinus Torvalds 1947f20d09d5SGustavo F. Padovan read_lock(&hci_dev_list_lock); 19488035ded4SLuiz Augusto von Dentz list_for_each_entry(hdev, &hci_dev_list, list) { 19492e84d8dbSMarcel Holtmann unsigned long flags = hdev->flags; 1950c542a06cSJohan Hedberg 19512e84d8dbSMarcel Holtmann /* When the auto-off is configured it means the transport 19522e84d8dbSMarcel Holtmann * is running, but in that case still indicate that the 19532e84d8dbSMarcel Holtmann * device is actually down. 19542e84d8dbSMarcel Holtmann */ 1955d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) 19562e84d8dbSMarcel Holtmann flags &= ~BIT(HCI_UP); 1957c542a06cSJohan Hedberg 19581da177e4SLinus Torvalds (dr + n)->dev_id = hdev->id; 19592e84d8dbSMarcel Holtmann (dr + n)->dev_opt = flags; 1960c542a06cSJohan Hedberg 19611da177e4SLinus Torvalds if (++n >= dev_num) 19621da177e4SLinus Torvalds break; 19631da177e4SLinus Torvalds } 1964f20d09d5SGustavo F. Padovan read_unlock(&hci_dev_list_lock); 19651da177e4SLinus Torvalds 19661da177e4SLinus Torvalds dl->dev_num = n; 19671da177e4SLinus Torvalds size = sizeof(*dl) + n * sizeof(*dr); 19681da177e4SLinus Torvalds 19691da177e4SLinus Torvalds err = copy_to_user(arg, dl, size); 19701da177e4SLinus Torvalds kfree(dl); 19711da177e4SLinus Torvalds 19721da177e4SLinus Torvalds return err ? -EFAULT : 0; 19731da177e4SLinus Torvalds } 19741da177e4SLinus Torvalds 19751da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg) 19761da177e4SLinus Torvalds { 19771da177e4SLinus Torvalds struct hci_dev *hdev; 19781da177e4SLinus Torvalds struct hci_dev_info di; 19792e84d8dbSMarcel Holtmann unsigned long flags; 19801da177e4SLinus Torvalds int err = 0; 19811da177e4SLinus Torvalds 19821da177e4SLinus Torvalds if (copy_from_user(&di, arg, sizeof(di))) 19831da177e4SLinus Torvalds return -EFAULT; 19841da177e4SLinus Torvalds 198570f23020SAndrei Emeltchenko hdev = hci_dev_get(di.dev_id); 198670f23020SAndrei Emeltchenko if (!hdev) 19871da177e4SLinus Torvalds return -ENODEV; 19881da177e4SLinus Torvalds 19892e84d8dbSMarcel Holtmann /* When the auto-off is configured it means the transport 19902e84d8dbSMarcel Holtmann * is running, but in that case still indicate that the 19912e84d8dbSMarcel Holtmann * device is actually down. 19922e84d8dbSMarcel Holtmann */ 1993d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) 19942e84d8dbSMarcel Holtmann flags = hdev->flags & ~BIT(HCI_UP); 19952e84d8dbSMarcel Holtmann else 19962e84d8dbSMarcel Holtmann flags = hdev->flags; 1997c542a06cSJohan Hedberg 19981da177e4SLinus Torvalds strcpy(di.name, hdev->name); 19991da177e4SLinus Torvalds di.bdaddr = hdev->bdaddr; 200060f2a3edSMarcel Holtmann di.type = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4); 20012e84d8dbSMarcel Holtmann di.flags = flags; 20021da177e4SLinus Torvalds di.pkt_type = hdev->pkt_type; 2003572c7f84SJohan Hedberg if (lmp_bredr_capable(hdev)) { 20041da177e4SLinus Torvalds di.acl_mtu = hdev->acl_mtu; 20051da177e4SLinus Torvalds di.acl_pkts = hdev->acl_pkts; 20061da177e4SLinus Torvalds di.sco_mtu = hdev->sco_mtu; 20071da177e4SLinus Torvalds di.sco_pkts = hdev->sco_pkts; 2008572c7f84SJohan Hedberg } else { 2009572c7f84SJohan Hedberg di.acl_mtu = hdev->le_mtu; 2010572c7f84SJohan Hedberg di.acl_pkts = hdev->le_pkts; 2011572c7f84SJohan Hedberg di.sco_mtu = 0; 2012572c7f84SJohan Hedberg di.sco_pkts = 0; 2013572c7f84SJohan Hedberg } 20141da177e4SLinus Torvalds di.link_policy = hdev->link_policy; 20151da177e4SLinus Torvalds di.link_mode = hdev->link_mode; 20161da177e4SLinus Torvalds 20171da177e4SLinus Torvalds memcpy(&di.stat, &hdev->stat, sizeof(di.stat)); 20181da177e4SLinus Torvalds memcpy(&di.features, &hdev->features, sizeof(di.features)); 20191da177e4SLinus Torvalds 20201da177e4SLinus Torvalds if (copy_to_user(arg, &di, sizeof(di))) 20211da177e4SLinus Torvalds err = -EFAULT; 20221da177e4SLinus Torvalds 20231da177e4SLinus Torvalds hci_dev_put(hdev); 20241da177e4SLinus Torvalds 20251da177e4SLinus Torvalds return err; 20261da177e4SLinus Torvalds } 20271da177e4SLinus Torvalds 20281da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */ 20291da177e4SLinus Torvalds 2030611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked) 2031611b30f7SMarcel Holtmann { 2032611b30f7SMarcel Holtmann struct hci_dev *hdev = data; 2033611b30f7SMarcel Holtmann 2034611b30f7SMarcel Holtmann BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked); 2035611b30f7SMarcel Holtmann 2036d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) 20370736cfa8SMarcel Holtmann return -EBUSY; 20380736cfa8SMarcel Holtmann 20395e130367SJohan Hedberg if (blocked) { 2040a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RFKILLED); 2041d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_SETUP) && 2042d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) 2043611b30f7SMarcel Holtmann hci_dev_do_close(hdev); 20445e130367SJohan Hedberg } else { 2045a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_RFKILLED); 20465e130367SJohan Hedberg } 2047611b30f7SMarcel Holtmann 2048611b30f7SMarcel Holtmann return 0; 2049611b30f7SMarcel Holtmann } 2050611b30f7SMarcel Holtmann 2051611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = { 2052611b30f7SMarcel Holtmann .set_block = hci_rfkill_set_block, 2053611b30f7SMarcel Holtmann }; 2054611b30f7SMarcel Holtmann 2055ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work) 2056ab81cbf9SJohan Hedberg { 2057ab81cbf9SJohan Hedberg struct hci_dev *hdev = container_of(work, struct hci_dev, power_on); 205896570ffcSJohan Hedberg int err; 2059ab81cbf9SJohan Hedberg 2060ab81cbf9SJohan Hedberg BT_DBG("%s", hdev->name); 2061ab81cbf9SJohan Hedberg 2062cbed0ca1SJohan Hedberg err = hci_dev_do_open(hdev); 206396570ffcSJohan Hedberg if (err < 0) { 20643ad67582SJaganath Kanakkassery hci_dev_lock(hdev); 206596570ffcSJohan Hedberg mgmt_set_powered_failed(hdev, err); 20663ad67582SJaganath Kanakkassery hci_dev_unlock(hdev); 2067ab81cbf9SJohan Hedberg return; 206896570ffcSJohan Hedberg } 2069ab81cbf9SJohan Hedberg 2070a5c8f270SMarcel Holtmann /* During the HCI setup phase, a few error conditions are 2071a5c8f270SMarcel Holtmann * ignored and they need to be checked now. If they are still 2072a5c8f270SMarcel Holtmann * valid, it is important to turn the device back off. 2073a5c8f270SMarcel Holtmann */ 2074d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_RFKILLED) || 2075d7a5a11dSMarcel Holtmann hci_dev_test_flag(hdev, HCI_UNCONFIGURED) || 2076a5c8f270SMarcel Holtmann (hdev->dev_type == HCI_BREDR && 2077a5c8f270SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) && 2078a5c8f270SMarcel Holtmann !bacmp(&hdev->static_addr, BDADDR_ANY))) { 2079a358dc11SMarcel Holtmann hci_dev_clear_flag(hdev, HCI_AUTO_OFF); 2080bf543036SJohan Hedberg hci_dev_do_close(hdev); 2081d7a5a11dSMarcel Holtmann } else if (hci_dev_test_flag(hdev, HCI_AUTO_OFF)) { 208219202573SJohan Hedberg queue_delayed_work(hdev->req_workqueue, &hdev->power_off, 208319202573SJohan Hedberg HCI_AUTO_OFF_TIMEOUT); 2084bf543036SJohan Hedberg } 2085ab81cbf9SJohan Hedberg 2086a69d8927SMarcel Holtmann if (hci_dev_test_and_clear_flag(hdev, HCI_SETUP)) { 20874a964404SMarcel Holtmann /* For unconfigured devices, set the HCI_RAW flag 20884a964404SMarcel Holtmann * so that userspace can easily identify them. 20894a964404SMarcel Holtmann */ 2090d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 20914a964404SMarcel Holtmann set_bit(HCI_RAW, &hdev->flags); 20920602a8adSMarcel Holtmann 20930602a8adSMarcel Holtmann /* For fully configured devices, this will send 20940602a8adSMarcel Holtmann * the Index Added event. For unconfigured devices, 20950602a8adSMarcel Holtmann * it will send Unconfigued Index Added event. 20960602a8adSMarcel Holtmann * 20970602a8adSMarcel Holtmann * Devices with HCI_QUIRK_RAW_DEVICE are ignored 20980602a8adSMarcel Holtmann * and no event will be send. 20990602a8adSMarcel Holtmann */ 2100744cf19eSJohan Hedberg mgmt_index_added(hdev); 2101a69d8927SMarcel Holtmann } else if (hci_dev_test_and_clear_flag(hdev, HCI_CONFIG)) { 21025ea234d3SMarcel Holtmann /* When the controller is now configured, then it 21035ea234d3SMarcel Holtmann * is important to clear the HCI_RAW flag. 21045ea234d3SMarcel Holtmann */ 2105d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) 21065ea234d3SMarcel Holtmann clear_bit(HCI_RAW, &hdev->flags); 21075ea234d3SMarcel Holtmann 2108d603b76bSMarcel Holtmann /* Powering on the controller with HCI_CONFIG set only 2109d603b76bSMarcel Holtmann * happens with the transition from unconfigured to 2110d603b76bSMarcel Holtmann * configured. This will send the Index Added event. 2111d603b76bSMarcel Holtmann */ 2112d603b76bSMarcel Holtmann mgmt_index_added(hdev); 2113ab81cbf9SJohan Hedberg } 2114ab81cbf9SJohan Hedberg } 2115ab81cbf9SJohan Hedberg 2116ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work) 2117ab81cbf9SJohan Hedberg { 21183243553fSJohan Hedberg struct hci_dev *hdev = container_of(work, struct hci_dev, 21193243553fSJohan Hedberg power_off.work); 2120ab81cbf9SJohan Hedberg 2121ab81cbf9SJohan Hedberg BT_DBG("%s", hdev->name); 2122ab81cbf9SJohan Hedberg 21238ee56540SMarcel Holtmann hci_dev_do_close(hdev); 2124ab81cbf9SJohan Hedberg } 2125ab81cbf9SJohan Hedberg 2126c7741d16SMarcel Holtmann static void hci_error_reset(struct work_struct *work) 2127c7741d16SMarcel Holtmann { 2128c7741d16SMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, error_reset); 2129c7741d16SMarcel Holtmann 2130c7741d16SMarcel Holtmann BT_DBG("%s", hdev->name); 2131c7741d16SMarcel Holtmann 2132c7741d16SMarcel Holtmann if (hdev->hw_error) 2133c7741d16SMarcel Holtmann hdev->hw_error(hdev, hdev->hw_error_code); 2134c7741d16SMarcel Holtmann else 2135c7741d16SMarcel Holtmann BT_ERR("%s hardware error 0x%2.2x", hdev->name, 2136c7741d16SMarcel Holtmann hdev->hw_error_code); 2137c7741d16SMarcel Holtmann 2138c7741d16SMarcel Holtmann if (hci_dev_do_close(hdev)) 2139c7741d16SMarcel Holtmann return; 2140c7741d16SMarcel Holtmann 2141c7741d16SMarcel Holtmann hci_dev_do_open(hdev); 2142c7741d16SMarcel Holtmann } 2143c7741d16SMarcel Holtmann 214416ab91abSJohan Hedberg static void hci_discov_off(struct work_struct *work) 214516ab91abSJohan Hedberg { 214616ab91abSJohan Hedberg struct hci_dev *hdev; 214716ab91abSJohan Hedberg 214816ab91abSJohan Hedberg hdev = container_of(work, struct hci_dev, discov_off.work); 214916ab91abSJohan Hedberg 215016ab91abSJohan Hedberg BT_DBG("%s", hdev->name); 215116ab91abSJohan Hedberg 2152d1967ff8SMarcel Holtmann mgmt_discoverable_timeout(hdev); 215316ab91abSJohan Hedberg } 215416ab91abSJohan Hedberg 21555d900e46SFlorian Grandel static void hci_adv_timeout_expire(struct work_struct *work) 21565d900e46SFlorian Grandel { 21575d900e46SFlorian Grandel struct hci_dev *hdev; 21585d900e46SFlorian Grandel 21595d900e46SFlorian Grandel hdev = container_of(work, struct hci_dev, adv_instance_expire.work); 21605d900e46SFlorian Grandel 21615d900e46SFlorian Grandel BT_DBG("%s", hdev->name); 21625d900e46SFlorian Grandel 21635d900e46SFlorian Grandel mgmt_adv_timeout_expired(hdev); 21645d900e46SFlorian Grandel } 21655d900e46SFlorian Grandel 216635f7498aSJohan Hedberg void hci_uuids_clear(struct hci_dev *hdev) 21672aeb9a1aSJohan Hedberg { 21684821002cSJohan Hedberg struct bt_uuid *uuid, *tmp; 21692aeb9a1aSJohan Hedberg 21704821002cSJohan Hedberg list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) { 21714821002cSJohan Hedberg list_del(&uuid->list); 21722aeb9a1aSJohan Hedberg kfree(uuid); 21732aeb9a1aSJohan Hedberg } 21742aeb9a1aSJohan Hedberg } 21752aeb9a1aSJohan Hedberg 217635f7498aSJohan Hedberg void hci_link_keys_clear(struct hci_dev *hdev) 217755ed8ca1SJohan Hedberg { 217855ed8ca1SJohan Hedberg struct link_key *key; 217955ed8ca1SJohan Hedberg 21800378b597SJohan Hedberg list_for_each_entry_rcu(key, &hdev->link_keys, list) { 21810378b597SJohan Hedberg list_del_rcu(&key->list); 21820378b597SJohan Hedberg kfree_rcu(key, rcu); 218355ed8ca1SJohan Hedberg } 218455ed8ca1SJohan Hedberg } 218555ed8ca1SJohan Hedberg 218635f7498aSJohan Hedberg void hci_smp_ltks_clear(struct hci_dev *hdev) 2187b899efafSVinicius Costa Gomes { 2188970d0f1bSJohan Hedberg struct smp_ltk *k; 2189b899efafSVinicius Costa Gomes 2190970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 2191970d0f1bSJohan Hedberg list_del_rcu(&k->list); 2192970d0f1bSJohan Hedberg kfree_rcu(k, rcu); 2193b899efafSVinicius Costa Gomes } 2194b899efafSVinicius Costa Gomes } 2195b899efafSVinicius Costa Gomes 2196970c4e46SJohan Hedberg void hci_smp_irks_clear(struct hci_dev *hdev) 2197970c4e46SJohan Hedberg { 2198adae20cbSJohan Hedberg struct smp_irk *k; 2199970c4e46SJohan Hedberg 2200adae20cbSJohan Hedberg list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) { 2201adae20cbSJohan Hedberg list_del_rcu(&k->list); 2202adae20cbSJohan Hedberg kfree_rcu(k, rcu); 2203970c4e46SJohan Hedberg } 2204970c4e46SJohan Hedberg } 2205970c4e46SJohan Hedberg 220655ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) 220755ed8ca1SJohan Hedberg { 220855ed8ca1SJohan Hedberg struct link_key *k; 220955ed8ca1SJohan Hedberg 22100378b597SJohan Hedberg rcu_read_lock(); 22110378b597SJohan Hedberg list_for_each_entry_rcu(k, &hdev->link_keys, list) { 22120378b597SJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) == 0) { 22130378b597SJohan Hedberg rcu_read_unlock(); 221455ed8ca1SJohan Hedberg return k; 22150378b597SJohan Hedberg } 22160378b597SJohan Hedberg } 22170378b597SJohan Hedberg rcu_read_unlock(); 221855ed8ca1SJohan Hedberg 221955ed8ca1SJohan Hedberg return NULL; 222055ed8ca1SJohan Hedberg } 222155ed8ca1SJohan Hedberg 2222745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn, 2223d25e28abSJohan Hedberg u8 key_type, u8 old_key_type) 2224d25e28abSJohan Hedberg { 2225d25e28abSJohan Hedberg /* Legacy key */ 2226d25e28abSJohan Hedberg if (key_type < 0x03) 2227745c0ce3SVishal Agarwal return true; 2228d25e28abSJohan Hedberg 2229d25e28abSJohan Hedberg /* Debug keys are insecure so don't store them persistently */ 2230d25e28abSJohan Hedberg if (key_type == HCI_LK_DEBUG_COMBINATION) 2231745c0ce3SVishal Agarwal return false; 2232d25e28abSJohan Hedberg 2233d25e28abSJohan Hedberg /* Changed combination key and there's no previous one */ 2234d25e28abSJohan Hedberg if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff) 2235745c0ce3SVishal Agarwal return false; 2236d25e28abSJohan Hedberg 2237d25e28abSJohan Hedberg /* Security mode 3 case */ 2238d25e28abSJohan Hedberg if (!conn) 2239745c0ce3SVishal Agarwal return true; 2240d25e28abSJohan Hedberg 2241e3befab9SJohan Hedberg /* BR/EDR key derived using SC from an LE link */ 2242e3befab9SJohan Hedberg if (conn->type == LE_LINK) 2243e3befab9SJohan Hedberg return true; 2244e3befab9SJohan Hedberg 2245d25e28abSJohan Hedberg /* Neither local nor remote side had no-bonding as requirement */ 2246d25e28abSJohan Hedberg if (conn->auth_type > 0x01 && conn->remote_auth > 0x01) 2247745c0ce3SVishal Agarwal return true; 2248d25e28abSJohan Hedberg 2249d25e28abSJohan Hedberg /* Local side had dedicated bonding as requirement */ 2250d25e28abSJohan Hedberg if (conn->auth_type == 0x02 || conn->auth_type == 0x03) 2251745c0ce3SVishal Agarwal return true; 2252d25e28abSJohan Hedberg 2253d25e28abSJohan Hedberg /* Remote side had dedicated bonding as requirement */ 2254d25e28abSJohan Hedberg if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03) 2255745c0ce3SVishal Agarwal return true; 2256d25e28abSJohan Hedberg 2257d25e28abSJohan Hedberg /* If none of the above criteria match, then don't store the key 2258d25e28abSJohan Hedberg * persistently */ 2259745c0ce3SVishal Agarwal return false; 2260d25e28abSJohan Hedberg } 2261d25e28abSJohan Hedberg 2262e804d25dSJohan Hedberg static u8 ltk_role(u8 type) 226398a0b845SJohan Hedberg { 2264e804d25dSJohan Hedberg if (type == SMP_LTK) 2265e804d25dSJohan Hedberg return HCI_ROLE_MASTER; 226698a0b845SJohan Hedberg 2267e804d25dSJohan Hedberg return HCI_ROLE_SLAVE; 226898a0b845SJohan Hedberg } 226998a0b845SJohan Hedberg 2270f3a73d97SJohan Hedberg struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, 2271e804d25dSJohan Hedberg u8 addr_type, u8 role) 227275d262c2SVinicius Costa Gomes { 2273c9839a11SVinicius Costa Gomes struct smp_ltk *k; 227475d262c2SVinicius Costa Gomes 2275970d0f1bSJohan Hedberg rcu_read_lock(); 2276970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 22775378bc56SJohan Hedberg if (addr_type != k->bdaddr_type || bacmp(bdaddr, &k->bdaddr)) 22785378bc56SJohan Hedberg continue; 22795378bc56SJohan Hedberg 2280923e2414SJohan Hedberg if (smp_ltk_is_sc(k) || ltk_role(k->type) == role) { 2281970d0f1bSJohan Hedberg rcu_read_unlock(); 228275d262c2SVinicius Costa Gomes return k; 2283970d0f1bSJohan Hedberg } 2284970d0f1bSJohan Hedberg } 2285970d0f1bSJohan Hedberg rcu_read_unlock(); 228675d262c2SVinicius Costa Gomes 228775d262c2SVinicius Costa Gomes return NULL; 228875d262c2SVinicius Costa Gomes } 228975d262c2SVinicius Costa Gomes 2290970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa) 2291970c4e46SJohan Hedberg { 2292970c4e46SJohan Hedberg struct smp_irk *irk; 2293970c4e46SJohan Hedberg 2294adae20cbSJohan Hedberg rcu_read_lock(); 2295adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2296adae20cbSJohan Hedberg if (!bacmp(&irk->rpa, rpa)) { 2297adae20cbSJohan Hedberg rcu_read_unlock(); 2298970c4e46SJohan Hedberg return irk; 2299970c4e46SJohan Hedberg } 2300adae20cbSJohan Hedberg } 2301970c4e46SJohan Hedberg 2302adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2303defce9e8SJohan Hedberg if (smp_irk_matches(hdev, irk->val, rpa)) { 2304970c4e46SJohan Hedberg bacpy(&irk->rpa, rpa); 2305adae20cbSJohan Hedberg rcu_read_unlock(); 2306970c4e46SJohan Hedberg return irk; 2307970c4e46SJohan Hedberg } 2308970c4e46SJohan Hedberg } 2309adae20cbSJohan Hedberg rcu_read_unlock(); 2310970c4e46SJohan Hedberg 2311970c4e46SJohan Hedberg return NULL; 2312970c4e46SJohan Hedberg } 2313970c4e46SJohan Hedberg 2314970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr, 2315970c4e46SJohan Hedberg u8 addr_type) 2316970c4e46SJohan Hedberg { 2317970c4e46SJohan Hedberg struct smp_irk *irk; 2318970c4e46SJohan Hedberg 23196cfc9988SJohan Hedberg /* Identity Address must be public or static random */ 23206cfc9988SJohan Hedberg if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0) 23216cfc9988SJohan Hedberg return NULL; 23226cfc9988SJohan Hedberg 2323adae20cbSJohan Hedberg rcu_read_lock(); 2324adae20cbSJohan Hedberg list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) { 2325970c4e46SJohan Hedberg if (addr_type == irk->addr_type && 2326adae20cbSJohan Hedberg bacmp(bdaddr, &irk->bdaddr) == 0) { 2327adae20cbSJohan Hedberg rcu_read_unlock(); 2328970c4e46SJohan Hedberg return irk; 2329970c4e46SJohan Hedberg } 2330adae20cbSJohan Hedberg } 2331adae20cbSJohan Hedberg rcu_read_unlock(); 2332970c4e46SJohan Hedberg 2333970c4e46SJohan Hedberg return NULL; 2334970c4e46SJohan Hedberg } 2335970c4e46SJohan Hedberg 2336567fa2aaSJohan Hedberg struct link_key *hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, 23377652ff6aSJohan Hedberg bdaddr_t *bdaddr, u8 *val, u8 type, 23387652ff6aSJohan Hedberg u8 pin_len, bool *persistent) 233955ed8ca1SJohan Hedberg { 234055ed8ca1SJohan Hedberg struct link_key *key, *old_key; 2341745c0ce3SVishal Agarwal u8 old_key_type; 234255ed8ca1SJohan Hedberg 234355ed8ca1SJohan Hedberg old_key = hci_find_link_key(hdev, bdaddr); 234455ed8ca1SJohan Hedberg if (old_key) { 234555ed8ca1SJohan Hedberg old_key_type = old_key->type; 234655ed8ca1SJohan Hedberg key = old_key; 234755ed8ca1SJohan Hedberg } else { 234812adcf3aSJohan Hedberg old_key_type = conn ? conn->key_type : 0xff; 23490a14ab41SJohan Hedberg key = kzalloc(sizeof(*key), GFP_KERNEL); 235055ed8ca1SJohan Hedberg if (!key) 2351567fa2aaSJohan Hedberg return NULL; 23520378b597SJohan Hedberg list_add_rcu(&key->list, &hdev->link_keys); 235355ed8ca1SJohan Hedberg } 235455ed8ca1SJohan Hedberg 23556ed93dc6SAndrei Emeltchenko BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type); 235655ed8ca1SJohan Hedberg 2357d25e28abSJohan Hedberg /* Some buggy controller combinations generate a changed 2358d25e28abSJohan Hedberg * combination key for legacy pairing even when there's no 2359d25e28abSJohan Hedberg * previous key */ 2360d25e28abSJohan Hedberg if (type == HCI_LK_CHANGED_COMBINATION && 2361a8c5fb1aSGustavo Padovan (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) { 2362d25e28abSJohan Hedberg type = HCI_LK_COMBINATION; 2363655fe6ecSJohan Hedberg if (conn) 2364655fe6ecSJohan Hedberg conn->key_type = type; 2365655fe6ecSJohan Hedberg } 2366d25e28abSJohan Hedberg 236755ed8ca1SJohan Hedberg bacpy(&key->bdaddr, bdaddr); 23689b3b4460SAndrei Emeltchenko memcpy(key->val, val, HCI_LINK_KEY_SIZE); 236955ed8ca1SJohan Hedberg key->pin_len = pin_len; 237055ed8ca1SJohan Hedberg 2371b6020ba0SWaldemar Rymarkiewicz if (type == HCI_LK_CHANGED_COMBINATION) 237255ed8ca1SJohan Hedberg key->type = old_key_type; 23734748fed2SJohan Hedberg else 23744748fed2SJohan Hedberg key->type = type; 23754748fed2SJohan Hedberg 23767652ff6aSJohan Hedberg if (persistent) 23777652ff6aSJohan Hedberg *persistent = hci_persistent_key(hdev, conn, type, 23787652ff6aSJohan Hedberg old_key_type); 23794df378a1SJohan Hedberg 2380567fa2aaSJohan Hedberg return key; 238155ed8ca1SJohan Hedberg } 238255ed8ca1SJohan Hedberg 2383ca9142b8SJohan Hedberg struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, 238435d70271SJohan Hedberg u8 addr_type, u8 type, u8 authenticated, 2385fe39c7b2SMarcel Holtmann u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand) 238675d262c2SVinicius Costa Gomes { 2387c9839a11SVinicius Costa Gomes struct smp_ltk *key, *old_key; 2388e804d25dSJohan Hedberg u8 role = ltk_role(type); 238975d262c2SVinicius Costa Gomes 2390f3a73d97SJohan Hedberg old_key = hci_find_ltk(hdev, bdaddr, addr_type, role); 2391c9839a11SVinicius Costa Gomes if (old_key) 239275d262c2SVinicius Costa Gomes key = old_key; 2393c9839a11SVinicius Costa Gomes else { 23940a14ab41SJohan Hedberg key = kzalloc(sizeof(*key), GFP_KERNEL); 239575d262c2SVinicius Costa Gomes if (!key) 2396ca9142b8SJohan Hedberg return NULL; 2397970d0f1bSJohan Hedberg list_add_rcu(&key->list, &hdev->long_term_keys); 239875d262c2SVinicius Costa Gomes } 239975d262c2SVinicius Costa Gomes 240075d262c2SVinicius Costa Gomes bacpy(&key->bdaddr, bdaddr); 2401c9839a11SVinicius Costa Gomes key->bdaddr_type = addr_type; 2402c9839a11SVinicius Costa Gomes memcpy(key->val, tk, sizeof(key->val)); 2403c9839a11SVinicius Costa Gomes key->authenticated = authenticated; 2404c9839a11SVinicius Costa Gomes key->ediv = ediv; 2405fe39c7b2SMarcel Holtmann key->rand = rand; 2406c9839a11SVinicius Costa Gomes key->enc_size = enc_size; 2407c9839a11SVinicius Costa Gomes key->type = type; 240875d262c2SVinicius Costa Gomes 2409ca9142b8SJohan Hedberg return key; 241075d262c2SVinicius Costa Gomes } 241175d262c2SVinicius Costa Gomes 2412ca9142b8SJohan Hedberg struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, 2413ca9142b8SJohan Hedberg u8 addr_type, u8 val[16], bdaddr_t *rpa) 2414970c4e46SJohan Hedberg { 2415970c4e46SJohan Hedberg struct smp_irk *irk; 2416970c4e46SJohan Hedberg 2417970c4e46SJohan Hedberg irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type); 2418970c4e46SJohan Hedberg if (!irk) { 2419970c4e46SJohan Hedberg irk = kzalloc(sizeof(*irk), GFP_KERNEL); 2420970c4e46SJohan Hedberg if (!irk) 2421ca9142b8SJohan Hedberg return NULL; 2422970c4e46SJohan Hedberg 2423970c4e46SJohan Hedberg bacpy(&irk->bdaddr, bdaddr); 2424970c4e46SJohan Hedberg irk->addr_type = addr_type; 2425970c4e46SJohan Hedberg 2426adae20cbSJohan Hedberg list_add_rcu(&irk->list, &hdev->identity_resolving_keys); 2427970c4e46SJohan Hedberg } 2428970c4e46SJohan Hedberg 2429970c4e46SJohan Hedberg memcpy(irk->val, val, 16); 2430970c4e46SJohan Hedberg bacpy(&irk->rpa, rpa); 2431970c4e46SJohan Hedberg 2432ca9142b8SJohan Hedberg return irk; 2433970c4e46SJohan Hedberg } 2434970c4e46SJohan Hedberg 243555ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) 243655ed8ca1SJohan Hedberg { 243755ed8ca1SJohan Hedberg struct link_key *key; 243855ed8ca1SJohan Hedberg 243955ed8ca1SJohan Hedberg key = hci_find_link_key(hdev, bdaddr); 244055ed8ca1SJohan Hedberg if (!key) 244155ed8ca1SJohan Hedberg return -ENOENT; 244255ed8ca1SJohan Hedberg 24436ed93dc6SAndrei Emeltchenko BT_DBG("%s removing %pMR", hdev->name, bdaddr); 244455ed8ca1SJohan Hedberg 24450378b597SJohan Hedberg list_del_rcu(&key->list); 24460378b597SJohan Hedberg kfree_rcu(key, rcu); 244755ed8ca1SJohan Hedberg 244855ed8ca1SJohan Hedberg return 0; 244955ed8ca1SJohan Hedberg } 245055ed8ca1SJohan Hedberg 2451e0b2b27eSJohan Hedberg int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type) 2452b899efafSVinicius Costa Gomes { 2453970d0f1bSJohan Hedberg struct smp_ltk *k; 2454c51ffa0bSJohan Hedberg int removed = 0; 2455b899efafSVinicius Costa Gomes 2456970d0f1bSJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 2457e0b2b27eSJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type) 2458b899efafSVinicius Costa Gomes continue; 2459b899efafSVinicius Costa Gomes 24606ed93dc6SAndrei Emeltchenko BT_DBG("%s removing %pMR", hdev->name, bdaddr); 2461b899efafSVinicius Costa Gomes 2462970d0f1bSJohan Hedberg list_del_rcu(&k->list); 2463970d0f1bSJohan Hedberg kfree_rcu(k, rcu); 2464c51ffa0bSJohan Hedberg removed++; 2465b899efafSVinicius Costa Gomes } 2466b899efafSVinicius Costa Gomes 2467c51ffa0bSJohan Hedberg return removed ? 0 : -ENOENT; 2468b899efafSVinicius Costa Gomes } 2469b899efafSVinicius Costa Gomes 2470a7ec7338SJohan Hedberg void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type) 2471a7ec7338SJohan Hedberg { 2472adae20cbSJohan Hedberg struct smp_irk *k; 2473a7ec7338SJohan Hedberg 2474adae20cbSJohan Hedberg list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) { 2475a7ec7338SJohan Hedberg if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type) 2476a7ec7338SJohan Hedberg continue; 2477a7ec7338SJohan Hedberg 2478a7ec7338SJohan Hedberg BT_DBG("%s removing %pMR", hdev->name, bdaddr); 2479a7ec7338SJohan Hedberg 2480adae20cbSJohan Hedberg list_del_rcu(&k->list); 2481adae20cbSJohan Hedberg kfree_rcu(k, rcu); 2482a7ec7338SJohan Hedberg } 2483a7ec7338SJohan Hedberg } 2484a7ec7338SJohan Hedberg 248555e76b38SJohan Hedberg bool hci_bdaddr_is_paired(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) 248655e76b38SJohan Hedberg { 248755e76b38SJohan Hedberg struct smp_ltk *k; 24884ba9faf3SJohan Hedberg struct smp_irk *irk; 248955e76b38SJohan Hedberg u8 addr_type; 249055e76b38SJohan Hedberg 249155e76b38SJohan Hedberg if (type == BDADDR_BREDR) { 249255e76b38SJohan Hedberg if (hci_find_link_key(hdev, bdaddr)) 249355e76b38SJohan Hedberg return true; 249455e76b38SJohan Hedberg return false; 249555e76b38SJohan Hedberg } 249655e76b38SJohan Hedberg 249755e76b38SJohan Hedberg /* Convert to HCI addr type which struct smp_ltk uses */ 249855e76b38SJohan Hedberg if (type == BDADDR_LE_PUBLIC) 249955e76b38SJohan Hedberg addr_type = ADDR_LE_DEV_PUBLIC; 250055e76b38SJohan Hedberg else 250155e76b38SJohan Hedberg addr_type = ADDR_LE_DEV_RANDOM; 250255e76b38SJohan Hedberg 25034ba9faf3SJohan Hedberg irk = hci_get_irk(hdev, bdaddr, addr_type); 25044ba9faf3SJohan Hedberg if (irk) { 25054ba9faf3SJohan Hedberg bdaddr = &irk->bdaddr; 25064ba9faf3SJohan Hedberg addr_type = irk->addr_type; 25074ba9faf3SJohan Hedberg } 25084ba9faf3SJohan Hedberg 250955e76b38SJohan Hedberg rcu_read_lock(); 251055e76b38SJohan Hedberg list_for_each_entry_rcu(k, &hdev->long_term_keys, list) { 251187c8b28dSJohan Hedberg if (k->bdaddr_type == addr_type && !bacmp(bdaddr, &k->bdaddr)) { 251287c8b28dSJohan Hedberg rcu_read_unlock(); 251355e76b38SJohan Hedberg return true; 251455e76b38SJohan Hedberg } 251587c8b28dSJohan Hedberg } 251655e76b38SJohan Hedberg rcu_read_unlock(); 251755e76b38SJohan Hedberg 251855e76b38SJohan Hedberg return false; 251955e76b38SJohan Hedberg } 252055e76b38SJohan Hedberg 25216bd32326SVille Tervo /* HCI command timer function */ 252265cc2b49SMarcel Holtmann static void hci_cmd_timeout(struct work_struct *work) 25236bd32326SVille Tervo { 252465cc2b49SMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, 252565cc2b49SMarcel Holtmann cmd_timer.work); 25266bd32326SVille Tervo 2527bda4f23aSAndrei Emeltchenko if (hdev->sent_cmd) { 2528bda4f23aSAndrei Emeltchenko struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data; 2529bda4f23aSAndrei Emeltchenko u16 opcode = __le16_to_cpu(sent->opcode); 2530bda4f23aSAndrei Emeltchenko 2531bda4f23aSAndrei Emeltchenko BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode); 2532bda4f23aSAndrei Emeltchenko } else { 25336bd32326SVille Tervo BT_ERR("%s command tx timeout", hdev->name); 2534bda4f23aSAndrei Emeltchenko } 2535bda4f23aSAndrei Emeltchenko 25366bd32326SVille Tervo atomic_set(&hdev->cmd_cnt, 1); 2537c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 25386bd32326SVille Tervo } 25396bd32326SVille Tervo 25402763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev, 25416928a924SJohan Hedberg bdaddr_t *bdaddr, u8 bdaddr_type) 25422763eda6SSzymon Janc { 25432763eda6SSzymon Janc struct oob_data *data; 25442763eda6SSzymon Janc 25456928a924SJohan Hedberg list_for_each_entry(data, &hdev->remote_oob_data, list) { 25466928a924SJohan Hedberg if (bacmp(bdaddr, &data->bdaddr) != 0) 25476928a924SJohan Hedberg continue; 25486928a924SJohan Hedberg if (data->bdaddr_type != bdaddr_type) 25496928a924SJohan Hedberg continue; 25502763eda6SSzymon Janc return data; 25516928a924SJohan Hedberg } 25522763eda6SSzymon Janc 25532763eda6SSzymon Janc return NULL; 25542763eda6SSzymon Janc } 25552763eda6SSzymon Janc 25566928a924SJohan Hedberg int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, 25576928a924SJohan Hedberg u8 bdaddr_type) 25582763eda6SSzymon Janc { 25592763eda6SSzymon Janc struct oob_data *data; 25602763eda6SSzymon Janc 25616928a924SJohan Hedberg data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type); 25622763eda6SSzymon Janc if (!data) 25632763eda6SSzymon Janc return -ENOENT; 25642763eda6SSzymon Janc 25656928a924SJohan Hedberg BT_DBG("%s removing %pMR (%u)", hdev->name, bdaddr, bdaddr_type); 25662763eda6SSzymon Janc 25672763eda6SSzymon Janc list_del(&data->list); 25682763eda6SSzymon Janc kfree(data); 25692763eda6SSzymon Janc 25702763eda6SSzymon Janc return 0; 25712763eda6SSzymon Janc } 25722763eda6SSzymon Janc 257335f7498aSJohan Hedberg void hci_remote_oob_data_clear(struct hci_dev *hdev) 25742763eda6SSzymon Janc { 25752763eda6SSzymon Janc struct oob_data *data, *n; 25762763eda6SSzymon Janc 25772763eda6SSzymon Janc list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) { 25782763eda6SSzymon Janc list_del(&data->list); 25792763eda6SSzymon Janc kfree(data); 25802763eda6SSzymon Janc } 25812763eda6SSzymon Janc } 25822763eda6SSzymon Janc 25830798872eSMarcel Holtmann int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, 25846928a924SJohan Hedberg u8 bdaddr_type, u8 *hash192, u8 *rand192, 258538da1703SJohan Hedberg u8 *hash256, u8 *rand256) 25860798872eSMarcel Holtmann { 25870798872eSMarcel Holtmann struct oob_data *data; 25880798872eSMarcel Holtmann 25896928a924SJohan Hedberg data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type); 25900798872eSMarcel Holtmann if (!data) { 25910a14ab41SJohan Hedberg data = kmalloc(sizeof(*data), GFP_KERNEL); 25920798872eSMarcel Holtmann if (!data) 25930798872eSMarcel Holtmann return -ENOMEM; 25940798872eSMarcel Holtmann 25950798872eSMarcel Holtmann bacpy(&data->bdaddr, bdaddr); 25966928a924SJohan Hedberg data->bdaddr_type = bdaddr_type; 25970798872eSMarcel Holtmann list_add(&data->list, &hdev->remote_oob_data); 25980798872eSMarcel Holtmann } 25990798872eSMarcel Holtmann 260081328d5cSJohan Hedberg if (hash192 && rand192) { 26010798872eSMarcel Holtmann memcpy(data->hash192, hash192, sizeof(data->hash192)); 260238da1703SJohan Hedberg memcpy(data->rand192, rand192, sizeof(data->rand192)); 2603f7697b16SMarcel Holtmann if (hash256 && rand256) 2604f7697b16SMarcel Holtmann data->present = 0x03; 260581328d5cSJohan Hedberg } else { 260681328d5cSJohan Hedberg memset(data->hash192, 0, sizeof(data->hash192)); 260781328d5cSJohan Hedberg memset(data->rand192, 0, sizeof(data->rand192)); 2608f7697b16SMarcel Holtmann if (hash256 && rand256) 2609f7697b16SMarcel Holtmann data->present = 0x02; 2610f7697b16SMarcel Holtmann else 2611f7697b16SMarcel Holtmann data->present = 0x00; 261281328d5cSJohan Hedberg } 26130798872eSMarcel Holtmann 261481328d5cSJohan Hedberg if (hash256 && rand256) { 26150798872eSMarcel Holtmann memcpy(data->hash256, hash256, sizeof(data->hash256)); 261638da1703SJohan Hedberg memcpy(data->rand256, rand256, sizeof(data->rand256)); 261781328d5cSJohan Hedberg } else { 261881328d5cSJohan Hedberg memset(data->hash256, 0, sizeof(data->hash256)); 261981328d5cSJohan Hedberg memset(data->rand256, 0, sizeof(data->rand256)); 2620f7697b16SMarcel Holtmann if (hash192 && rand192) 2621f7697b16SMarcel Holtmann data->present = 0x01; 262281328d5cSJohan Hedberg } 26230798872eSMarcel Holtmann 26246ed93dc6SAndrei Emeltchenko BT_DBG("%s for %pMR", hdev->name, bdaddr); 26252763eda6SSzymon Janc 26262763eda6SSzymon Janc return 0; 26272763eda6SSzymon Janc } 26282763eda6SSzymon Janc 2629d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2630d2609b34SFlorian Grandel struct adv_info *hci_find_adv_instance(struct hci_dev *hdev, u8 instance) 2631d2609b34SFlorian Grandel { 2632d2609b34SFlorian Grandel struct adv_info *adv_instance; 2633d2609b34SFlorian Grandel 2634d2609b34SFlorian Grandel list_for_each_entry(adv_instance, &hdev->adv_instances, list) { 2635d2609b34SFlorian Grandel if (adv_instance->instance == instance) 2636d2609b34SFlorian Grandel return adv_instance; 2637d2609b34SFlorian Grandel } 2638d2609b34SFlorian Grandel 2639d2609b34SFlorian Grandel return NULL; 2640d2609b34SFlorian Grandel } 2641d2609b34SFlorian Grandel 2642d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2643d2609b34SFlorian Grandel struct adv_info *hci_get_next_instance(struct hci_dev *hdev, u8 instance) { 2644d2609b34SFlorian Grandel struct adv_info *cur_instance; 2645d2609b34SFlorian Grandel 2646d2609b34SFlorian Grandel cur_instance = hci_find_adv_instance(hdev, instance); 2647d2609b34SFlorian Grandel if (!cur_instance) 2648d2609b34SFlorian Grandel return NULL; 2649d2609b34SFlorian Grandel 2650d2609b34SFlorian Grandel if (cur_instance == list_last_entry(&hdev->adv_instances, 2651d2609b34SFlorian Grandel struct adv_info, list)) 2652d2609b34SFlorian Grandel return list_first_entry(&hdev->adv_instances, 2653d2609b34SFlorian Grandel struct adv_info, list); 2654d2609b34SFlorian Grandel else 2655d2609b34SFlorian Grandel return list_next_entry(cur_instance, list); 2656d2609b34SFlorian Grandel } 2657d2609b34SFlorian Grandel 2658d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2659d2609b34SFlorian Grandel int hci_remove_adv_instance(struct hci_dev *hdev, u8 instance) 2660d2609b34SFlorian Grandel { 2661d2609b34SFlorian Grandel struct adv_info *adv_instance; 2662d2609b34SFlorian Grandel 2663d2609b34SFlorian Grandel adv_instance = hci_find_adv_instance(hdev, instance); 2664d2609b34SFlorian Grandel if (!adv_instance) 2665d2609b34SFlorian Grandel return -ENOENT; 2666d2609b34SFlorian Grandel 2667d2609b34SFlorian Grandel BT_DBG("%s removing %dMR", hdev->name, instance); 2668d2609b34SFlorian Grandel 26695d900e46SFlorian Grandel if (hdev->cur_adv_instance == instance && hdev->adv_instance_timeout) { 26705d900e46SFlorian Grandel cancel_delayed_work(&hdev->adv_instance_expire); 26715d900e46SFlorian Grandel hdev->adv_instance_timeout = 0; 26725d900e46SFlorian Grandel } 26735d900e46SFlorian Grandel 2674d2609b34SFlorian Grandel list_del(&adv_instance->list); 2675d2609b34SFlorian Grandel kfree(adv_instance); 2676d2609b34SFlorian Grandel 2677d2609b34SFlorian Grandel hdev->adv_instance_cnt--; 2678d2609b34SFlorian Grandel 2679d2609b34SFlorian Grandel return 0; 2680d2609b34SFlorian Grandel } 2681d2609b34SFlorian Grandel 2682d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2683d2609b34SFlorian Grandel void hci_adv_instances_clear(struct hci_dev *hdev) 2684d2609b34SFlorian Grandel { 2685d2609b34SFlorian Grandel struct adv_info *adv_instance, *n; 2686d2609b34SFlorian Grandel 26875d900e46SFlorian Grandel if (hdev->adv_instance_timeout) { 26885d900e46SFlorian Grandel cancel_delayed_work(&hdev->adv_instance_expire); 26895d900e46SFlorian Grandel hdev->adv_instance_timeout = 0; 26905d900e46SFlorian Grandel } 26915d900e46SFlorian Grandel 2692d2609b34SFlorian Grandel list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) { 2693d2609b34SFlorian Grandel list_del(&adv_instance->list); 2694d2609b34SFlorian Grandel kfree(adv_instance); 2695d2609b34SFlorian Grandel } 2696d2609b34SFlorian Grandel 2697d2609b34SFlorian Grandel hdev->adv_instance_cnt = 0; 2698d2609b34SFlorian Grandel } 2699d2609b34SFlorian Grandel 2700d2609b34SFlorian Grandel /* This function requires the caller holds hdev->lock */ 2701d2609b34SFlorian Grandel int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags, 2702d2609b34SFlorian Grandel u16 adv_data_len, u8 *adv_data, 2703d2609b34SFlorian Grandel u16 scan_rsp_len, u8 *scan_rsp_data, 2704d2609b34SFlorian Grandel u16 timeout, u16 duration) 2705d2609b34SFlorian Grandel { 2706d2609b34SFlorian Grandel struct adv_info *adv_instance; 2707d2609b34SFlorian Grandel 2708d2609b34SFlorian Grandel adv_instance = hci_find_adv_instance(hdev, instance); 2709d2609b34SFlorian Grandel if (adv_instance) { 2710d2609b34SFlorian Grandel memset(adv_instance->adv_data, 0, 2711d2609b34SFlorian Grandel sizeof(adv_instance->adv_data)); 2712d2609b34SFlorian Grandel memset(adv_instance->scan_rsp_data, 0, 2713d2609b34SFlorian Grandel sizeof(adv_instance->scan_rsp_data)); 2714d2609b34SFlorian Grandel } else { 2715d2609b34SFlorian Grandel if (hdev->adv_instance_cnt >= HCI_MAX_ADV_INSTANCES || 2716d2609b34SFlorian Grandel instance < 1 || instance > HCI_MAX_ADV_INSTANCES) 2717d2609b34SFlorian Grandel return -EOVERFLOW; 2718d2609b34SFlorian Grandel 2719d2609b34SFlorian Grandel adv_instance = kmalloc(sizeof(*adv_instance), GFP_KERNEL); 2720d2609b34SFlorian Grandel if (!adv_instance) 2721d2609b34SFlorian Grandel return -ENOMEM; 2722d2609b34SFlorian Grandel 2723d2609b34SFlorian Grandel memset(adv_instance, 0, sizeof(*adv_instance)); 2724fffd38bcSFlorian Grandel adv_instance->pending = true; 2725d2609b34SFlorian Grandel adv_instance->instance = instance; 2726d2609b34SFlorian Grandel list_add(&adv_instance->list, &hdev->adv_instances); 2727d2609b34SFlorian Grandel hdev->adv_instance_cnt++; 2728d2609b34SFlorian Grandel } 2729d2609b34SFlorian Grandel 2730d2609b34SFlorian Grandel adv_instance->flags = flags; 2731d2609b34SFlorian Grandel adv_instance->adv_data_len = adv_data_len; 2732d2609b34SFlorian Grandel adv_instance->scan_rsp_len = scan_rsp_len; 2733d2609b34SFlorian Grandel 2734d2609b34SFlorian Grandel if (adv_data_len) 2735d2609b34SFlorian Grandel memcpy(adv_instance->adv_data, adv_data, adv_data_len); 2736d2609b34SFlorian Grandel 2737d2609b34SFlorian Grandel if (scan_rsp_len) 2738d2609b34SFlorian Grandel memcpy(adv_instance->scan_rsp_data, 2739d2609b34SFlorian Grandel scan_rsp_data, scan_rsp_len); 2740d2609b34SFlorian Grandel 2741d2609b34SFlorian Grandel adv_instance->timeout = timeout; 27425d900e46SFlorian Grandel adv_instance->remaining_time = timeout; 2743d2609b34SFlorian Grandel 2744d2609b34SFlorian Grandel if (duration == 0) 2745d2609b34SFlorian Grandel adv_instance->duration = HCI_DEFAULT_ADV_DURATION; 2746d2609b34SFlorian Grandel else 2747d2609b34SFlorian Grandel adv_instance->duration = duration; 2748d2609b34SFlorian Grandel 2749d2609b34SFlorian Grandel BT_DBG("%s for %dMR", hdev->name, instance); 2750d2609b34SFlorian Grandel 2751d2609b34SFlorian Grandel return 0; 2752d2609b34SFlorian Grandel } 2753d2609b34SFlorian Grandel 2754dcc36c16SJohan Hedberg struct bdaddr_list *hci_bdaddr_list_lookup(struct list_head *bdaddr_list, 2755b9ee0a78SMarcel Holtmann bdaddr_t *bdaddr, u8 type) 2756b2a66aadSAntti Julku { 2757b2a66aadSAntti Julku struct bdaddr_list *b; 2758b2a66aadSAntti Julku 2759dcc36c16SJohan Hedberg list_for_each_entry(b, bdaddr_list, list) { 2760b9ee0a78SMarcel Holtmann if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type) 2761b2a66aadSAntti Julku return b; 2762b9ee0a78SMarcel Holtmann } 2763b2a66aadSAntti Julku 2764b2a66aadSAntti Julku return NULL; 2765b2a66aadSAntti Julku } 2766b2a66aadSAntti Julku 2767dcc36c16SJohan Hedberg void hci_bdaddr_list_clear(struct list_head *bdaddr_list) 2768b2a66aadSAntti Julku { 2769b2a66aadSAntti Julku struct list_head *p, *n; 2770b2a66aadSAntti Julku 2771dcc36c16SJohan Hedberg list_for_each_safe(p, n, bdaddr_list) { 2772b9ee0a78SMarcel Holtmann struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list); 2773b2a66aadSAntti Julku 2774b2a66aadSAntti Julku list_del(p); 2775b2a66aadSAntti Julku kfree(b); 2776b2a66aadSAntti Julku } 2777b2a66aadSAntti Julku } 2778b2a66aadSAntti Julku 2779dcc36c16SJohan Hedberg int hci_bdaddr_list_add(struct list_head *list, bdaddr_t *bdaddr, u8 type) 2780b2a66aadSAntti Julku { 2781b2a66aadSAntti Julku struct bdaddr_list *entry; 2782b2a66aadSAntti Julku 2783b9ee0a78SMarcel Holtmann if (!bacmp(bdaddr, BDADDR_ANY)) 2784b2a66aadSAntti Julku return -EBADF; 2785b2a66aadSAntti Julku 2786dcc36c16SJohan Hedberg if (hci_bdaddr_list_lookup(list, bdaddr, type)) 27875e762444SAntti Julku return -EEXIST; 2788b2a66aadSAntti Julku 278927f70f3eSJohan Hedberg entry = kzalloc(sizeof(*entry), GFP_KERNEL); 27905e762444SAntti Julku if (!entry) 27915e762444SAntti Julku return -ENOMEM; 2792b2a66aadSAntti Julku 2793b2a66aadSAntti Julku bacpy(&entry->bdaddr, bdaddr); 2794b9ee0a78SMarcel Holtmann entry->bdaddr_type = type; 2795b2a66aadSAntti Julku 2796dcc36c16SJohan Hedberg list_add(&entry->list, list); 2797b2a66aadSAntti Julku 27982a8357f2SJohan Hedberg return 0; 2799b2a66aadSAntti Julku } 2800b2a66aadSAntti Julku 2801dcc36c16SJohan Hedberg int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, u8 type) 2802b2a66aadSAntti Julku { 2803b2a66aadSAntti Julku struct bdaddr_list *entry; 2804b2a66aadSAntti Julku 280535f7498aSJohan Hedberg if (!bacmp(bdaddr, BDADDR_ANY)) { 2806dcc36c16SJohan Hedberg hci_bdaddr_list_clear(list); 280735f7498aSJohan Hedberg return 0; 280835f7498aSJohan Hedberg } 2809b2a66aadSAntti Julku 2810dcc36c16SJohan Hedberg entry = hci_bdaddr_list_lookup(list, bdaddr, type); 2811d2ab0ac1SMarcel Holtmann if (!entry) 2812d2ab0ac1SMarcel Holtmann return -ENOENT; 2813d2ab0ac1SMarcel Holtmann 2814d2ab0ac1SMarcel Holtmann list_del(&entry->list); 2815d2ab0ac1SMarcel Holtmann kfree(entry); 2816d2ab0ac1SMarcel Holtmann 2817d2ab0ac1SMarcel Holtmann return 0; 2818d2ab0ac1SMarcel Holtmann } 2819d2ab0ac1SMarcel Holtmann 282015819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 282115819a70SAndre Guedes struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, 282215819a70SAndre Guedes bdaddr_t *addr, u8 addr_type) 282315819a70SAndre Guedes { 282415819a70SAndre Guedes struct hci_conn_params *params; 282515819a70SAndre Guedes 2826738f6185SJohan Hedberg /* The conn params list only contains identity addresses */ 2827738f6185SJohan Hedberg if (!hci_is_identity_address(addr, addr_type)) 2828738f6185SJohan Hedberg return NULL; 2829738f6185SJohan Hedberg 283015819a70SAndre Guedes list_for_each_entry(params, &hdev->le_conn_params, list) { 283115819a70SAndre Guedes if (bacmp(¶ms->addr, addr) == 0 && 283215819a70SAndre Guedes params->addr_type == addr_type) { 283315819a70SAndre Guedes return params; 283415819a70SAndre Guedes } 283515819a70SAndre Guedes } 283615819a70SAndre Guedes 283715819a70SAndre Guedes return NULL; 283815819a70SAndre Guedes } 283915819a70SAndre Guedes 284015819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 2841501f8827SJohan Hedberg struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list, 28424b10966fSMarcel Holtmann bdaddr_t *addr, u8 addr_type) 284315819a70SAndre Guedes { 2844912b42efSJohan Hedberg struct hci_conn_params *param; 284515819a70SAndre Guedes 2846738f6185SJohan Hedberg /* The list only contains identity addresses */ 2847738f6185SJohan Hedberg if (!hci_is_identity_address(addr, addr_type)) 2848738f6185SJohan Hedberg return NULL; 284915819a70SAndre Guedes 2850501f8827SJohan Hedberg list_for_each_entry(param, list, action) { 2851912b42efSJohan Hedberg if (bacmp(¶m->addr, addr) == 0 && 2852912b42efSJohan Hedberg param->addr_type == addr_type) 2853912b42efSJohan Hedberg return param; 28544b10966fSMarcel Holtmann } 28554b10966fSMarcel Holtmann 28564b10966fSMarcel Holtmann return NULL; 285715819a70SAndre Guedes } 285815819a70SAndre Guedes 285915819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 286051d167c0SMarcel Holtmann struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev, 286151d167c0SMarcel Holtmann bdaddr_t *addr, u8 addr_type) 286215819a70SAndre Guedes { 286315819a70SAndre Guedes struct hci_conn_params *params; 286415819a70SAndre Guedes 2865c46245b3SJohan Hedberg if (!hci_is_identity_address(addr, addr_type)) 286651d167c0SMarcel Holtmann return NULL; 2867a9b0a04cSAndre Guedes 286815819a70SAndre Guedes params = hci_conn_params_lookup(hdev, addr, addr_type); 2869cef952ceSAndre Guedes if (params) 287051d167c0SMarcel Holtmann return params; 287115819a70SAndre Guedes 287215819a70SAndre Guedes params = kzalloc(sizeof(*params), GFP_KERNEL); 287315819a70SAndre Guedes if (!params) { 287415819a70SAndre Guedes BT_ERR("Out of memory"); 287551d167c0SMarcel Holtmann return NULL; 287615819a70SAndre Guedes } 287715819a70SAndre Guedes 287815819a70SAndre Guedes bacpy(¶ms->addr, addr); 287915819a70SAndre Guedes params->addr_type = addr_type; 2880cef952ceSAndre Guedes 2881cef952ceSAndre Guedes list_add(¶ms->list, &hdev->le_conn_params); 288293450c75SJohan Hedberg INIT_LIST_HEAD(¶ms->action); 2883cef952ceSAndre Guedes 2884bf5b3c8bSMarcel Holtmann params->conn_min_interval = hdev->le_conn_min_interval; 2885bf5b3c8bSMarcel Holtmann params->conn_max_interval = hdev->le_conn_max_interval; 2886bf5b3c8bSMarcel Holtmann params->conn_latency = hdev->le_conn_latency; 2887bf5b3c8bSMarcel Holtmann params->supervision_timeout = hdev->le_supv_timeout; 2888bf5b3c8bSMarcel Holtmann params->auto_connect = HCI_AUTO_CONN_DISABLED; 2889bf5b3c8bSMarcel Holtmann 2890bf5b3c8bSMarcel Holtmann BT_DBG("addr %pMR (type %u)", addr, addr_type); 2891bf5b3c8bSMarcel Holtmann 289251d167c0SMarcel Holtmann return params; 2893bf5b3c8bSMarcel Holtmann } 2894bf5b3c8bSMarcel Holtmann 2895f6c63249SJohan Hedberg static void hci_conn_params_free(struct hci_conn_params *params) 2896f6c63249SJohan Hedberg { 2897f6c63249SJohan Hedberg if (params->conn) { 2898f6c63249SJohan Hedberg hci_conn_drop(params->conn); 2899f6c63249SJohan Hedberg hci_conn_put(params->conn); 2900f6c63249SJohan Hedberg } 2901f6c63249SJohan Hedberg 2902f6c63249SJohan Hedberg list_del(¶ms->action); 2903f6c63249SJohan Hedberg list_del(¶ms->list); 2904f6c63249SJohan Hedberg kfree(params); 2905f6c63249SJohan Hedberg } 2906f6c63249SJohan Hedberg 290715819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 290815819a70SAndre Guedes void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type) 290915819a70SAndre Guedes { 291015819a70SAndre Guedes struct hci_conn_params *params; 291115819a70SAndre Guedes 291215819a70SAndre Guedes params = hci_conn_params_lookup(hdev, addr, addr_type); 291315819a70SAndre Guedes if (!params) 291415819a70SAndre Guedes return; 291515819a70SAndre Guedes 2916f6c63249SJohan Hedberg hci_conn_params_free(params); 291715819a70SAndre Guedes 291895305baaSJohan Hedberg hci_update_background_scan(hdev); 291995305baaSJohan Hedberg 292015819a70SAndre Guedes BT_DBG("addr %pMR (type %u)", addr, addr_type); 292115819a70SAndre Guedes } 292215819a70SAndre Guedes 292315819a70SAndre Guedes /* This function requires the caller holds hdev->lock */ 292455af49a8SJohan Hedberg void hci_conn_params_clear_disabled(struct hci_dev *hdev) 292515819a70SAndre Guedes { 292615819a70SAndre Guedes struct hci_conn_params *params, *tmp; 292715819a70SAndre Guedes 292815819a70SAndre Guedes list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) { 292955af49a8SJohan Hedberg if (params->auto_connect != HCI_AUTO_CONN_DISABLED) 293055af49a8SJohan Hedberg continue; 293115819a70SAndre Guedes list_del(¶ms->list); 293215819a70SAndre Guedes kfree(params); 293315819a70SAndre Guedes } 293415819a70SAndre Guedes 293555af49a8SJohan Hedberg BT_DBG("All LE disabled connection parameters were removed"); 293655af49a8SJohan Hedberg } 293755af49a8SJohan Hedberg 293855af49a8SJohan Hedberg /* This function requires the caller holds hdev->lock */ 2939373110c5SJohan Hedberg void hci_conn_params_clear_all(struct hci_dev *hdev) 294015819a70SAndre Guedes { 294115819a70SAndre Guedes struct hci_conn_params *params, *tmp; 294215819a70SAndre Guedes 2943f6c63249SJohan Hedberg list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) 2944f6c63249SJohan Hedberg hci_conn_params_free(params); 294515819a70SAndre Guedes 2946a2f41a8fSJohan Hedberg hci_update_background_scan(hdev); 29471089b67dSMarcel Holtmann 294815819a70SAndre Guedes BT_DBG("All LE connection parameters were removed"); 294915819a70SAndre Guedes } 295015819a70SAndre Guedes 29511904a853SMarcel Holtmann static void inquiry_complete(struct hci_dev *hdev, u8 status, u16 opcode) 29527ba8b4beSAndre Guedes { 29534c87eaabSAndre Guedes if (status) { 29544c87eaabSAndre Guedes BT_ERR("Failed to start inquiry: status %d", status); 29557ba8b4beSAndre Guedes 29564c87eaabSAndre Guedes hci_dev_lock(hdev); 29574c87eaabSAndre Guedes hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 29584c87eaabSAndre Guedes hci_dev_unlock(hdev); 29594c87eaabSAndre Guedes return; 29604c87eaabSAndre Guedes } 29617ba8b4beSAndre Guedes } 29627ba8b4beSAndre Guedes 29631904a853SMarcel Holtmann static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status, 29641904a853SMarcel Holtmann u16 opcode) 29657ba8b4beSAndre Guedes { 29664c87eaabSAndre Guedes /* General inquiry access code (GIAC) */ 29674c87eaabSAndre Guedes u8 lap[3] = { 0x33, 0x8b, 0x9e }; 29684c87eaabSAndre Guedes struct hci_cp_inquiry cp; 29697ba8b4beSAndre Guedes int err; 29707ba8b4beSAndre Guedes 29714c87eaabSAndre Guedes if (status) { 29724c87eaabSAndre Guedes BT_ERR("Failed to disable LE scanning: status %d", status); 29734c87eaabSAndre Guedes return; 29747ba8b4beSAndre Guedes } 29757ba8b4beSAndre Guedes 29762d28cfe7SJakub Pawlowski hdev->discovery.scan_start = 0; 29772d28cfe7SJakub Pawlowski 29784c87eaabSAndre Guedes switch (hdev->discovery.type) { 29794c87eaabSAndre Guedes case DISCOV_TYPE_LE: 29804c87eaabSAndre Guedes hci_dev_lock(hdev); 29814c87eaabSAndre Guedes hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 29824c87eaabSAndre Guedes hci_dev_unlock(hdev); 29834c87eaabSAndre Guedes break; 29847dbfac1dSAndre Guedes 29854c87eaabSAndre Guedes case DISCOV_TYPE_INTERLEAVED: 29864c87eaabSAndre Guedes hci_dev_lock(hdev); 29874c87eaabSAndre Guedes 298807d2334aSJakub Pawlowski if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, 298907d2334aSJakub Pawlowski &hdev->quirks)) { 299007d2334aSJakub Pawlowski /* If we were running LE only scan, change discovery 299107d2334aSJakub Pawlowski * state. If we were running both LE and BR/EDR inquiry 299207d2334aSJakub Pawlowski * simultaneously, and BR/EDR inquiry is already 299307d2334aSJakub Pawlowski * finished, stop discovery, otherwise BR/EDR inquiry 2994177d0506SWesley Kuo * will stop discovery when finished. If we will resolve 2995177d0506SWesley Kuo * remote device name, do not change discovery state. 299607d2334aSJakub Pawlowski */ 2997177d0506SWesley Kuo if (!test_bit(HCI_INQUIRY, &hdev->flags) && 2998177d0506SWesley Kuo hdev->discovery.state != DISCOVERY_RESOLVING) 299907d2334aSJakub Pawlowski hci_discovery_set_state(hdev, 300007d2334aSJakub Pawlowski DISCOVERY_STOPPED); 300107d2334aSJakub Pawlowski } else { 3002baf880a9SJohan Hedberg struct hci_request req; 3003baf880a9SJohan Hedberg 30044c87eaabSAndre Guedes hci_inquiry_cache_flush(hdev); 30054c87eaabSAndre Guedes 3006baf880a9SJohan Hedberg hci_req_init(&req, hdev); 3007baf880a9SJohan Hedberg 3008baf880a9SJohan Hedberg memset(&cp, 0, sizeof(cp)); 3009baf880a9SJohan Hedberg memcpy(&cp.lap, lap, sizeof(cp.lap)); 3010baf880a9SJohan Hedberg cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN; 3011baf880a9SJohan Hedberg hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp); 3012baf880a9SJohan Hedberg 30134c87eaabSAndre Guedes err = hci_req_run(&req, inquiry_complete); 30144c87eaabSAndre Guedes if (err) { 30154c87eaabSAndre Guedes BT_ERR("Inquiry request failed: err %d", err); 301607d2334aSJakub Pawlowski hci_discovery_set_state(hdev, 301707d2334aSJakub Pawlowski DISCOVERY_STOPPED); 301807d2334aSJakub Pawlowski } 30197dbfac1dSAndre Guedes } 30207dbfac1dSAndre Guedes 30214c87eaabSAndre Guedes hci_dev_unlock(hdev); 30224c87eaabSAndre Guedes break; 30234c87eaabSAndre Guedes } 30247dbfac1dSAndre Guedes } 30257dbfac1dSAndre Guedes 30267ba8b4beSAndre Guedes static void le_scan_disable_work(struct work_struct *work) 30277ba8b4beSAndre Guedes { 30287ba8b4beSAndre Guedes struct hci_dev *hdev = container_of(work, struct hci_dev, 30297ba8b4beSAndre Guedes le_scan_disable.work); 30304c87eaabSAndre Guedes struct hci_request req; 30314c87eaabSAndre Guedes int err; 30327ba8b4beSAndre Guedes 30337ba8b4beSAndre Guedes BT_DBG("%s", hdev->name); 30347ba8b4beSAndre Guedes 30352d28cfe7SJakub Pawlowski cancel_delayed_work_sync(&hdev->le_scan_restart); 30362d28cfe7SJakub Pawlowski 30374c87eaabSAndre Guedes hci_req_init(&req, hdev); 30387ba8b4beSAndre Guedes 3039b1efcc28SAndre Guedes hci_req_add_le_scan_disable(&req); 30407ba8b4beSAndre Guedes 30414c87eaabSAndre Guedes err = hci_req_run(&req, le_scan_disable_work_complete); 30424c87eaabSAndre Guedes if (err) 30434c87eaabSAndre Guedes BT_ERR("Disable LE scanning request failed: err %d", err); 304428b75a89SAndre Guedes } 304528b75a89SAndre Guedes 30462d28cfe7SJakub Pawlowski static void le_scan_restart_work_complete(struct hci_dev *hdev, u8 status, 30472d28cfe7SJakub Pawlowski u16 opcode) 30482d28cfe7SJakub Pawlowski { 30492d28cfe7SJakub Pawlowski unsigned long timeout, duration, scan_start, now; 30502d28cfe7SJakub Pawlowski 30512d28cfe7SJakub Pawlowski BT_DBG("%s", hdev->name); 30522d28cfe7SJakub Pawlowski 30532d28cfe7SJakub Pawlowski if (status) { 30542d28cfe7SJakub Pawlowski BT_ERR("Failed to restart LE scan: status %d", status); 30552d28cfe7SJakub Pawlowski return; 30562d28cfe7SJakub Pawlowski } 30572d28cfe7SJakub Pawlowski 30582d28cfe7SJakub Pawlowski if (!test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks) || 30592d28cfe7SJakub Pawlowski !hdev->discovery.scan_start) 30602d28cfe7SJakub Pawlowski return; 30612d28cfe7SJakub Pawlowski 30622d28cfe7SJakub Pawlowski /* When the scan was started, hdev->le_scan_disable has been queued 30632d28cfe7SJakub Pawlowski * after duration from scan_start. During scan restart this job 30642d28cfe7SJakub Pawlowski * has been canceled, and we need to queue it again after proper 30652d28cfe7SJakub Pawlowski * timeout, to make sure that scan does not run indefinitely. 30662d28cfe7SJakub Pawlowski */ 30672d28cfe7SJakub Pawlowski duration = hdev->discovery.scan_duration; 30682d28cfe7SJakub Pawlowski scan_start = hdev->discovery.scan_start; 30692d28cfe7SJakub Pawlowski now = jiffies; 30702d28cfe7SJakub Pawlowski if (now - scan_start <= duration) { 30712d28cfe7SJakub Pawlowski int elapsed; 30722d28cfe7SJakub Pawlowski 30732d28cfe7SJakub Pawlowski if (now >= scan_start) 30742d28cfe7SJakub Pawlowski elapsed = now - scan_start; 30752d28cfe7SJakub Pawlowski else 30762d28cfe7SJakub Pawlowski elapsed = ULONG_MAX - scan_start + now; 30772d28cfe7SJakub Pawlowski 30782d28cfe7SJakub Pawlowski timeout = duration - elapsed; 30792d28cfe7SJakub Pawlowski } else { 30802d28cfe7SJakub Pawlowski timeout = 0; 30812d28cfe7SJakub Pawlowski } 30822d28cfe7SJakub Pawlowski queue_delayed_work(hdev->workqueue, 30832d28cfe7SJakub Pawlowski &hdev->le_scan_disable, timeout); 30842d28cfe7SJakub Pawlowski } 30852d28cfe7SJakub Pawlowski 30862d28cfe7SJakub Pawlowski static void le_scan_restart_work(struct work_struct *work) 30872d28cfe7SJakub Pawlowski { 30882d28cfe7SJakub Pawlowski struct hci_dev *hdev = container_of(work, struct hci_dev, 30892d28cfe7SJakub Pawlowski le_scan_restart.work); 30902d28cfe7SJakub Pawlowski struct hci_request req; 30912d28cfe7SJakub Pawlowski struct hci_cp_le_set_scan_enable cp; 30922d28cfe7SJakub Pawlowski int err; 30932d28cfe7SJakub Pawlowski 30942d28cfe7SJakub Pawlowski BT_DBG("%s", hdev->name); 30952d28cfe7SJakub Pawlowski 30962d28cfe7SJakub Pawlowski /* If controller is not scanning we are done. */ 3097d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_LE_SCAN)) 30982d28cfe7SJakub Pawlowski return; 30992d28cfe7SJakub Pawlowski 31002d28cfe7SJakub Pawlowski hci_req_init(&req, hdev); 31012d28cfe7SJakub Pawlowski 31022d28cfe7SJakub Pawlowski hci_req_add_le_scan_disable(&req); 31032d28cfe7SJakub Pawlowski 31042d28cfe7SJakub Pawlowski memset(&cp, 0, sizeof(cp)); 31052d28cfe7SJakub Pawlowski cp.enable = LE_SCAN_ENABLE; 31062d28cfe7SJakub Pawlowski cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE; 31072d28cfe7SJakub Pawlowski hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp); 31082d28cfe7SJakub Pawlowski 31092d28cfe7SJakub Pawlowski err = hci_req_run(&req, le_scan_restart_work_complete); 31102d28cfe7SJakub Pawlowski if (err) 31112d28cfe7SJakub Pawlowski BT_ERR("Restart LE scan request failed: err %d", err); 31122d28cfe7SJakub Pawlowski } 31132d28cfe7SJakub Pawlowski 3114a1f4c318SJohan Hedberg /* Copy the Identity Address of the controller. 3115a1f4c318SJohan Hedberg * 3116a1f4c318SJohan Hedberg * If the controller has a public BD_ADDR, then by default use that one. 3117a1f4c318SJohan Hedberg * If this is a LE only controller without a public address, default to 3118a1f4c318SJohan Hedberg * the static random address. 3119a1f4c318SJohan Hedberg * 3120a1f4c318SJohan Hedberg * For debugging purposes it is possible to force controllers with a 3121a1f4c318SJohan Hedberg * public address to use the static random address instead. 312250b5b952SMarcel Holtmann * 312350b5b952SMarcel Holtmann * In case BR/EDR has been disabled on a dual-mode controller and 312450b5b952SMarcel Holtmann * userspace has configured a static address, then that address 312550b5b952SMarcel Holtmann * becomes the identity address instead of the public BR/EDR address. 3126a1f4c318SJohan Hedberg */ 3127a1f4c318SJohan Hedberg void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, 3128a1f4c318SJohan Hedberg u8 *bdaddr_type) 3129a1f4c318SJohan Hedberg { 3130b7cb93e5SMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || 313150b5b952SMarcel Holtmann !bacmp(&hdev->bdaddr, BDADDR_ANY) || 3132d7a5a11dSMarcel Holtmann (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && 313350b5b952SMarcel Holtmann bacmp(&hdev->static_addr, BDADDR_ANY))) { 3134a1f4c318SJohan Hedberg bacpy(bdaddr, &hdev->static_addr); 3135a1f4c318SJohan Hedberg *bdaddr_type = ADDR_LE_DEV_RANDOM; 3136a1f4c318SJohan Hedberg } else { 3137a1f4c318SJohan Hedberg bacpy(bdaddr, &hdev->bdaddr); 3138a1f4c318SJohan Hedberg *bdaddr_type = ADDR_LE_DEV_PUBLIC; 3139a1f4c318SJohan Hedberg } 3140a1f4c318SJohan Hedberg } 3141a1f4c318SJohan Hedberg 31429be0dab7SDavid Herrmann /* Alloc HCI device */ 31439be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void) 31449be0dab7SDavid Herrmann { 31459be0dab7SDavid Herrmann struct hci_dev *hdev; 31469be0dab7SDavid Herrmann 314727f70f3eSJohan Hedberg hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); 31489be0dab7SDavid Herrmann if (!hdev) 31499be0dab7SDavid Herrmann return NULL; 31509be0dab7SDavid Herrmann 3151b1b813d4SDavid Herrmann hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); 3152b1b813d4SDavid Herrmann hdev->esco_type = (ESCO_HV1); 3153b1b813d4SDavid Herrmann hdev->link_mode = (HCI_LM_ACCEPT); 3154b4cb9fb2SMarcel Holtmann hdev->num_iac = 0x01; /* One IAC support is mandatory */ 3155b1b813d4SDavid Herrmann hdev->io_capability = 0x03; /* No Input No Output */ 315696c2103aSMarcel Holtmann hdev->manufacturer = 0xffff; /* Default to internal use */ 3157bbaf444aSJohan Hedberg hdev->inq_tx_power = HCI_TX_POWER_INVALID; 3158bbaf444aSJohan Hedberg hdev->adv_tx_power = HCI_TX_POWER_INVALID; 3159d2609b34SFlorian Grandel hdev->adv_instance_cnt = 0; 3160d2609b34SFlorian Grandel hdev->cur_adv_instance = 0x00; 31615d900e46SFlorian Grandel hdev->adv_instance_timeout = 0; 3162b1b813d4SDavid Herrmann 3163b1b813d4SDavid Herrmann hdev->sniff_max_interval = 800; 3164b1b813d4SDavid Herrmann hdev->sniff_min_interval = 80; 3165b1b813d4SDavid Herrmann 31663f959d46SMarcel Holtmann hdev->le_adv_channel_map = 0x07; 3167628531c9SGeorg Lukas hdev->le_adv_min_interval = 0x0800; 3168628531c9SGeorg Lukas hdev->le_adv_max_interval = 0x0800; 3169bef64738SMarcel Holtmann hdev->le_scan_interval = 0x0060; 3170bef64738SMarcel Holtmann hdev->le_scan_window = 0x0030; 31714e70c7e7SMarcel Holtmann hdev->le_conn_min_interval = 0x0028; 31724e70c7e7SMarcel Holtmann hdev->le_conn_max_interval = 0x0038; 317304fb7d90SMarcel Holtmann hdev->le_conn_latency = 0x0000; 317404fb7d90SMarcel Holtmann hdev->le_supv_timeout = 0x002a; 3175a8e1bfaaSMarcel Holtmann hdev->le_def_tx_len = 0x001b; 3176a8e1bfaaSMarcel Holtmann hdev->le_def_tx_time = 0x0148; 3177a8e1bfaaSMarcel Holtmann hdev->le_max_tx_len = 0x001b; 3178a8e1bfaaSMarcel Holtmann hdev->le_max_tx_time = 0x0148; 3179a8e1bfaaSMarcel Holtmann hdev->le_max_rx_len = 0x001b; 3180a8e1bfaaSMarcel Holtmann hdev->le_max_rx_time = 0x0148; 3181bef64738SMarcel Holtmann 3182d6bfd59cSJohan Hedberg hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT; 3183b9a7a61eSLukasz Rymanowski hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT; 318431ad1691SAndrzej Kaczmarek hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE; 318531ad1691SAndrzej Kaczmarek hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE; 3186d6bfd59cSJohan Hedberg 3187b1b813d4SDavid Herrmann mutex_init(&hdev->lock); 3188b1b813d4SDavid Herrmann mutex_init(&hdev->req_lock); 3189b1b813d4SDavid Herrmann 3190b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->mgmt_pending); 3191b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->blacklist); 31926659358eSJohan Hedberg INIT_LIST_HEAD(&hdev->whitelist); 3193b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->uuids); 3194b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->link_keys); 3195b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->long_term_keys); 3196970c4e46SJohan Hedberg INIT_LIST_HEAD(&hdev->identity_resolving_keys); 3197b1b813d4SDavid Herrmann INIT_LIST_HEAD(&hdev->remote_oob_data); 3198d2ab0ac1SMarcel Holtmann INIT_LIST_HEAD(&hdev->le_white_list); 319915819a70SAndre Guedes INIT_LIST_HEAD(&hdev->le_conn_params); 320077a77a30SAndre Guedes INIT_LIST_HEAD(&hdev->pend_le_conns); 320166f8455aSJohan Hedberg INIT_LIST_HEAD(&hdev->pend_le_reports); 32026b536b5eSAndrei Emeltchenko INIT_LIST_HEAD(&hdev->conn_hash.list); 3203d2609b34SFlorian Grandel INIT_LIST_HEAD(&hdev->adv_instances); 3204b1b813d4SDavid Herrmann 3205b1b813d4SDavid Herrmann INIT_WORK(&hdev->rx_work, hci_rx_work); 3206b1b813d4SDavid Herrmann INIT_WORK(&hdev->cmd_work, hci_cmd_work); 3207b1b813d4SDavid Herrmann INIT_WORK(&hdev->tx_work, hci_tx_work); 3208b1b813d4SDavid Herrmann INIT_WORK(&hdev->power_on, hci_power_on); 3209c7741d16SMarcel Holtmann INIT_WORK(&hdev->error_reset, hci_error_reset); 3210b1b813d4SDavid Herrmann 3211b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->power_off, hci_power_off); 3212b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off); 3213b1b813d4SDavid Herrmann INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work); 32142d28cfe7SJakub Pawlowski INIT_DELAYED_WORK(&hdev->le_scan_restart, le_scan_restart_work); 32155d900e46SFlorian Grandel INIT_DELAYED_WORK(&hdev->adv_instance_expire, hci_adv_timeout_expire); 3216b1b813d4SDavid Herrmann 3217b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->rx_q); 3218b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->cmd_q); 3219b1b813d4SDavid Herrmann skb_queue_head_init(&hdev->raw_q); 3220b1b813d4SDavid Herrmann 3221b1b813d4SDavid Herrmann init_waitqueue_head(&hdev->req_wait_q); 3222b1b813d4SDavid Herrmann 322365cc2b49SMarcel Holtmann INIT_DELAYED_WORK(&hdev->cmd_timer, hci_cmd_timeout); 3224b1b813d4SDavid Herrmann 3225b1b813d4SDavid Herrmann hci_init_sysfs(hdev); 3226b1b813d4SDavid Herrmann discovery_init(hdev); 3227203fea01SArman Uguray adv_info_init(hdev); 32289be0dab7SDavid Herrmann 32299be0dab7SDavid Herrmann return hdev; 32309be0dab7SDavid Herrmann } 32319be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev); 32329be0dab7SDavid Herrmann 32339be0dab7SDavid Herrmann /* Free HCI device */ 32349be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev) 32359be0dab7SDavid Herrmann { 32369be0dab7SDavid Herrmann /* will free via device release */ 32379be0dab7SDavid Herrmann put_device(&hdev->dev); 32389be0dab7SDavid Herrmann } 32399be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev); 32409be0dab7SDavid Herrmann 32411da177e4SLinus Torvalds /* Register HCI device */ 32421da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev) 32431da177e4SLinus Torvalds { 3244b1b813d4SDavid Herrmann int id, error; 32451da177e4SLinus Torvalds 324674292d5aSMarcel Holtmann if (!hdev->open || !hdev->close || !hdev->send) 32471da177e4SLinus Torvalds return -EINVAL; 32481da177e4SLinus Torvalds 324908add513SMat Martineau /* Do not allow HCI_AMP devices to register at index 0, 325008add513SMat Martineau * so the index can be used as the AMP controller ID. 325108add513SMat Martineau */ 32523df92b31SSasha Levin switch (hdev->dev_type) { 32533df92b31SSasha Levin case HCI_BREDR: 32543df92b31SSasha Levin id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL); 32551da177e4SLinus Torvalds break; 32563df92b31SSasha Levin case HCI_AMP: 32573df92b31SSasha Levin id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL); 32583df92b31SSasha Levin break; 32593df92b31SSasha Levin default: 32603df92b31SSasha Levin return -EINVAL; 32611da177e4SLinus Torvalds } 32621da177e4SLinus Torvalds 32633df92b31SSasha Levin if (id < 0) 32643df92b31SSasha Levin return id; 32653df92b31SSasha Levin 32661da177e4SLinus Torvalds sprintf(hdev->name, "hci%d", id); 32671da177e4SLinus Torvalds hdev->id = id; 32682d8b3a11SAndrei Emeltchenko 32692d8b3a11SAndrei Emeltchenko BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); 32702d8b3a11SAndrei Emeltchenko 3271d8537548SKees Cook hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND | 3272d8537548SKees Cook WQ_MEM_RECLAIM, 1, hdev->name); 327333ca954dSDavid Herrmann if (!hdev->workqueue) { 327433ca954dSDavid Herrmann error = -ENOMEM; 327533ca954dSDavid Herrmann goto err; 327633ca954dSDavid Herrmann } 3277f48fd9c8SMarcel Holtmann 3278d8537548SKees Cook hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND | 3279d8537548SKees Cook WQ_MEM_RECLAIM, 1, hdev->name); 32806ead1bbcSJohan Hedberg if (!hdev->req_workqueue) { 32816ead1bbcSJohan Hedberg destroy_workqueue(hdev->workqueue); 32826ead1bbcSJohan Hedberg error = -ENOMEM; 32836ead1bbcSJohan Hedberg goto err; 32846ead1bbcSJohan Hedberg } 32856ead1bbcSJohan Hedberg 32860153e2ecSMarcel Holtmann if (!IS_ERR_OR_NULL(bt_debugfs)) 32870153e2ecSMarcel Holtmann hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs); 32880153e2ecSMarcel Holtmann 3289bdc3e0f1SMarcel Holtmann dev_set_name(&hdev->dev, "%s", hdev->name); 3290bdc3e0f1SMarcel Holtmann 3291bdc3e0f1SMarcel Holtmann error = device_add(&hdev->dev); 329233ca954dSDavid Herrmann if (error < 0) 329354506918SJohan Hedberg goto err_wqueue; 32941da177e4SLinus Torvalds 3295611b30f7SMarcel Holtmann hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev, 3296a8c5fb1aSGustavo Padovan RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops, 3297a8c5fb1aSGustavo Padovan hdev); 3298611b30f7SMarcel Holtmann if (hdev->rfkill) { 3299611b30f7SMarcel Holtmann if (rfkill_register(hdev->rfkill) < 0) { 3300611b30f7SMarcel Holtmann rfkill_destroy(hdev->rfkill); 3301611b30f7SMarcel Holtmann hdev->rfkill = NULL; 3302611b30f7SMarcel Holtmann } 3303611b30f7SMarcel Holtmann } 3304611b30f7SMarcel Holtmann 33055e130367SJohan Hedberg if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) 3306a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_RFKILLED); 33075e130367SJohan Hedberg 3308a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_SETUP); 3309a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_AUTO_OFF); 3310ce2be9acSAndrei Emeltchenko 331101cd3404SMarcel Holtmann if (hdev->dev_type == HCI_BREDR) { 331256f87901SJohan Hedberg /* Assume BR/EDR support until proven otherwise (such as 331356f87901SJohan Hedberg * through reading supported features during init. 331456f87901SJohan Hedberg */ 3315a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); 331656f87901SJohan Hedberg } 3317ce2be9acSAndrei Emeltchenko 3318fcee3377SGustavo Padovan write_lock(&hci_dev_list_lock); 3319fcee3377SGustavo Padovan list_add(&hdev->list, &hci_dev_list); 3320fcee3377SGustavo Padovan write_unlock(&hci_dev_list_lock); 3321fcee3377SGustavo Padovan 33224a964404SMarcel Holtmann /* Devices that are marked for raw-only usage are unconfigured 33234a964404SMarcel Holtmann * and should not be included in normal operation. 3324fee746b0SMarcel Holtmann */ 3325fee746b0SMarcel Holtmann if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) 3326a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNCONFIGURED); 3327fee746b0SMarcel Holtmann 33281da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_REG); 3329dc946bd8SDavid Herrmann hci_dev_hold(hdev); 33301da177e4SLinus Torvalds 333119202573SJohan Hedberg queue_work(hdev->req_workqueue, &hdev->power_on); 3332fbe96d6fSMarcel Holtmann 33331da177e4SLinus Torvalds return id; 3334f48fd9c8SMarcel Holtmann 333533ca954dSDavid Herrmann err_wqueue: 333633ca954dSDavid Herrmann destroy_workqueue(hdev->workqueue); 33376ead1bbcSJohan Hedberg destroy_workqueue(hdev->req_workqueue); 333833ca954dSDavid Herrmann err: 33393df92b31SSasha Levin ida_simple_remove(&hci_index_ida, hdev->id); 3340f48fd9c8SMarcel Holtmann 334133ca954dSDavid Herrmann return error; 33421da177e4SLinus Torvalds } 33431da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev); 33441da177e4SLinus Torvalds 33451da177e4SLinus Torvalds /* Unregister HCI device */ 334659735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev) 33471da177e4SLinus Torvalds { 33482d7cc19eSMarcel Holtmann int id; 3349ef222013SMarcel Holtmann 3350c13854ceSMarcel Holtmann BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); 33511da177e4SLinus Torvalds 3352a1536da2SMarcel Holtmann hci_dev_set_flag(hdev, HCI_UNREGISTER); 335394324962SJohan Hovold 33543df92b31SSasha Levin id = hdev->id; 33553df92b31SSasha Levin 3356f20d09d5SGustavo F. Padovan write_lock(&hci_dev_list_lock); 33571da177e4SLinus Torvalds list_del(&hdev->list); 3358f20d09d5SGustavo F. Padovan write_unlock(&hci_dev_list_lock); 33591da177e4SLinus Torvalds 33601da177e4SLinus Torvalds hci_dev_do_close(hdev); 33611da177e4SLinus Torvalds 3362b9b5ef18SGustavo Padovan cancel_work_sync(&hdev->power_on); 3363b9b5ef18SGustavo Padovan 3364ab81cbf9SJohan Hedberg if (!test_bit(HCI_INIT, &hdev->flags) && 3365d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_SETUP) && 3366d7a5a11dSMarcel Holtmann !hci_dev_test_flag(hdev, HCI_CONFIG)) { 336709fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 3368744cf19eSJohan Hedberg mgmt_index_removed(hdev); 336909fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 337056e5cb86SJohan Hedberg } 3371ab81cbf9SJohan Hedberg 33722e58ef3eSJohan Hedberg /* mgmt_index_removed should take care of emptying the 33732e58ef3eSJohan Hedberg * pending list */ 33742e58ef3eSJohan Hedberg BUG_ON(!list_empty(&hdev->mgmt_pending)); 33752e58ef3eSJohan Hedberg 33761da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_UNREG); 33771da177e4SLinus Torvalds 3378611b30f7SMarcel Holtmann if (hdev->rfkill) { 3379611b30f7SMarcel Holtmann rfkill_unregister(hdev->rfkill); 3380611b30f7SMarcel Holtmann rfkill_destroy(hdev->rfkill); 3381611b30f7SMarcel Holtmann } 3382611b30f7SMarcel Holtmann 3383bdc3e0f1SMarcel Holtmann device_del(&hdev->dev); 3384147e2d59SDave Young 33850153e2ecSMarcel Holtmann debugfs_remove_recursive(hdev->debugfs); 33860153e2ecSMarcel Holtmann 3387f48fd9c8SMarcel Holtmann destroy_workqueue(hdev->workqueue); 33886ead1bbcSJohan Hedberg destroy_workqueue(hdev->req_workqueue); 3389f48fd9c8SMarcel Holtmann 339009fd0de5SGustavo F. Padovan hci_dev_lock(hdev); 3391dcc36c16SJohan Hedberg hci_bdaddr_list_clear(&hdev->blacklist); 33926659358eSJohan Hedberg hci_bdaddr_list_clear(&hdev->whitelist); 33932aeb9a1aSJohan Hedberg hci_uuids_clear(hdev); 339455ed8ca1SJohan Hedberg hci_link_keys_clear(hdev); 3395b899efafSVinicius Costa Gomes hci_smp_ltks_clear(hdev); 3396970c4e46SJohan Hedberg hci_smp_irks_clear(hdev); 33972763eda6SSzymon Janc hci_remote_oob_data_clear(hdev); 3398d2609b34SFlorian Grandel hci_adv_instances_clear(hdev); 3399dcc36c16SJohan Hedberg hci_bdaddr_list_clear(&hdev->le_white_list); 3400373110c5SJohan Hedberg hci_conn_params_clear_all(hdev); 340122078800SMarcel Holtmann hci_discovery_filter_clear(hdev); 340209fd0de5SGustavo F. Padovan hci_dev_unlock(hdev); 3403e2e0cacbSJohan Hedberg 3404dc946bd8SDavid Herrmann hci_dev_put(hdev); 34053df92b31SSasha Levin 34063df92b31SSasha Levin ida_simple_remove(&hci_index_ida, id); 34071da177e4SLinus Torvalds } 34081da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev); 34091da177e4SLinus Torvalds 34101da177e4SLinus Torvalds /* Suspend HCI device */ 34111da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev) 34121da177e4SLinus Torvalds { 34131da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_SUSPEND); 34141da177e4SLinus Torvalds return 0; 34151da177e4SLinus Torvalds } 34161da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev); 34171da177e4SLinus Torvalds 34181da177e4SLinus Torvalds /* Resume HCI device */ 34191da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev) 34201da177e4SLinus Torvalds { 34211da177e4SLinus Torvalds hci_notify(hdev, HCI_DEV_RESUME); 34221da177e4SLinus Torvalds return 0; 34231da177e4SLinus Torvalds } 34241da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev); 34251da177e4SLinus Torvalds 342675e0569fSMarcel Holtmann /* Reset HCI device */ 342775e0569fSMarcel Holtmann int hci_reset_dev(struct hci_dev *hdev) 342875e0569fSMarcel Holtmann { 342975e0569fSMarcel Holtmann const u8 hw_err[] = { HCI_EV_HARDWARE_ERROR, 0x01, 0x00 }; 343075e0569fSMarcel Holtmann struct sk_buff *skb; 343175e0569fSMarcel Holtmann 343275e0569fSMarcel Holtmann skb = bt_skb_alloc(3, GFP_ATOMIC); 343375e0569fSMarcel Holtmann if (!skb) 343475e0569fSMarcel Holtmann return -ENOMEM; 343575e0569fSMarcel Holtmann 343675e0569fSMarcel Holtmann bt_cb(skb)->pkt_type = HCI_EVENT_PKT; 343775e0569fSMarcel Holtmann memcpy(skb_put(skb, 3), hw_err, 3); 343875e0569fSMarcel Holtmann 343975e0569fSMarcel Holtmann /* Send Hardware Error to upper stack */ 344075e0569fSMarcel Holtmann return hci_recv_frame(hdev, skb); 344175e0569fSMarcel Holtmann } 344275e0569fSMarcel Holtmann EXPORT_SYMBOL(hci_reset_dev); 344375e0569fSMarcel Holtmann 344476bca880SMarcel Holtmann /* Receive frame from HCI drivers */ 3445e1a26170SMarcel Holtmann int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb) 344676bca880SMarcel Holtmann { 344776bca880SMarcel Holtmann if (!hdev || (!test_bit(HCI_UP, &hdev->flags) 344876bca880SMarcel Holtmann && !test_bit(HCI_INIT, &hdev->flags))) { 344976bca880SMarcel Holtmann kfree_skb(skb); 345076bca880SMarcel Holtmann return -ENXIO; 345176bca880SMarcel Holtmann } 345276bca880SMarcel Holtmann 3453d82603c6SJorrit Schippers /* Incoming skb */ 345476bca880SMarcel Holtmann bt_cb(skb)->incoming = 1; 345576bca880SMarcel Holtmann 345676bca880SMarcel Holtmann /* Time stamp */ 345776bca880SMarcel Holtmann __net_timestamp(skb); 345876bca880SMarcel Holtmann 345976bca880SMarcel Holtmann skb_queue_tail(&hdev->rx_q, skb); 3460b78752ccSMarcel Holtmann queue_work(hdev->workqueue, &hdev->rx_work); 3461c78ae283SMarcel Holtmann 346276bca880SMarcel Holtmann return 0; 346376bca880SMarcel Holtmann } 346476bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame); 346576bca880SMarcel Holtmann 34661da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */ 34671da177e4SLinus Torvalds 34681da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb) 34691da177e4SLinus Torvalds { 34701da177e4SLinus Torvalds BT_DBG("%p name %s", cb, cb->name); 34711da177e4SLinus Torvalds 3472fba7ecf0SJohan Hedberg mutex_lock(&hci_cb_list_lock); 347300629e0fSJohan Hedberg list_add_tail(&cb->list, &hci_cb_list); 3474fba7ecf0SJohan Hedberg mutex_unlock(&hci_cb_list_lock); 34751da177e4SLinus Torvalds 34761da177e4SLinus Torvalds return 0; 34771da177e4SLinus Torvalds } 34781da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb); 34791da177e4SLinus Torvalds 34801da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb) 34811da177e4SLinus Torvalds { 34821da177e4SLinus Torvalds BT_DBG("%p name %s", cb, cb->name); 34831da177e4SLinus Torvalds 3484fba7ecf0SJohan Hedberg mutex_lock(&hci_cb_list_lock); 34851da177e4SLinus Torvalds list_del(&cb->list); 3486fba7ecf0SJohan Hedberg mutex_unlock(&hci_cb_list_lock); 34871da177e4SLinus Torvalds 34881da177e4SLinus Torvalds return 0; 34891da177e4SLinus Torvalds } 34901da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb); 34911da177e4SLinus Torvalds 349251086991SMarcel Holtmann static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) 34931da177e4SLinus Torvalds { 3494cdc52faaSMarcel Holtmann int err; 3495cdc52faaSMarcel Holtmann 34960d48d939SMarcel Holtmann BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len); 34971da177e4SLinus Torvalds 34981da177e4SLinus Torvalds /* Time stamp */ 3499a61bbcf2SPatrick McHardy __net_timestamp(skb); 35001da177e4SLinus Torvalds 3501cd82e61cSMarcel Holtmann /* Send copy to monitor */ 3502cd82e61cSMarcel Holtmann hci_send_to_monitor(hdev, skb); 3503cd82e61cSMarcel Holtmann 3504cd82e61cSMarcel Holtmann if (atomic_read(&hdev->promisc)) { 3505cd82e61cSMarcel Holtmann /* Send copy to the sockets */ 3506470fe1b5SMarcel Holtmann hci_send_to_sock(hdev, skb); 35071da177e4SLinus Torvalds } 35081da177e4SLinus Torvalds 35091da177e4SLinus Torvalds /* Get rid of skb owner, prior to sending to the driver. */ 35101da177e4SLinus Torvalds skb_orphan(skb); 35111da177e4SLinus Torvalds 3512cdc52faaSMarcel Holtmann err = hdev->send(hdev, skb); 3513cdc52faaSMarcel Holtmann if (err < 0) { 3514cdc52faaSMarcel Holtmann BT_ERR("%s sending frame failed (%d)", hdev->name, err); 3515cdc52faaSMarcel Holtmann kfree_skb(skb); 3516cdc52faaSMarcel Holtmann } 35171da177e4SLinus Torvalds } 35181da177e4SLinus Torvalds 35191ca3a9d0SJohan Hedberg /* Send HCI command */ 352007dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, 352107dc93ddSJohan Hedberg const void *param) 35221ca3a9d0SJohan Hedberg { 35231ca3a9d0SJohan Hedberg struct sk_buff *skb; 35241ca3a9d0SJohan Hedberg 35251ca3a9d0SJohan Hedberg BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen); 35261ca3a9d0SJohan Hedberg 35271ca3a9d0SJohan Hedberg skb = hci_prepare_cmd(hdev, opcode, plen, param); 35281ca3a9d0SJohan Hedberg if (!skb) { 35291ca3a9d0SJohan Hedberg BT_ERR("%s no memory for command", hdev->name); 35301ca3a9d0SJohan Hedberg return -ENOMEM; 35311ca3a9d0SJohan Hedberg } 35321ca3a9d0SJohan Hedberg 353349c922bbSStephen Hemminger /* Stand-alone HCI commands must be flagged as 353411714b3dSJohan Hedberg * single-command requests. 353511714b3dSJohan Hedberg */ 3536db6e3e8dSJohan Hedberg bt_cb(skb)->req.start = true; 353711714b3dSJohan Hedberg 35381da177e4SLinus Torvalds skb_queue_tail(&hdev->cmd_q, skb); 3539c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 35401da177e4SLinus Torvalds 35411da177e4SLinus Torvalds return 0; 35421da177e4SLinus Torvalds } 35431da177e4SLinus Torvalds 35441da177e4SLinus Torvalds /* Get data from the previously sent command */ 3545a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode) 35461da177e4SLinus Torvalds { 35471da177e4SLinus Torvalds struct hci_command_hdr *hdr; 35481da177e4SLinus Torvalds 35491da177e4SLinus Torvalds if (!hdev->sent_cmd) 35501da177e4SLinus Torvalds return NULL; 35511da177e4SLinus Torvalds 35521da177e4SLinus Torvalds hdr = (void *) hdev->sent_cmd->data; 35531da177e4SLinus Torvalds 3554a9de9248SMarcel Holtmann if (hdr->opcode != cpu_to_le16(opcode)) 35551da177e4SLinus Torvalds return NULL; 35561da177e4SLinus Torvalds 3557f0e09510SAndrei Emeltchenko BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode); 35581da177e4SLinus Torvalds 35591da177e4SLinus Torvalds return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE; 35601da177e4SLinus Torvalds } 35611da177e4SLinus Torvalds 35621da177e4SLinus Torvalds /* Send ACL data */ 35631da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags) 35641da177e4SLinus Torvalds { 35651da177e4SLinus Torvalds struct hci_acl_hdr *hdr; 35661da177e4SLinus Torvalds int len = skb->len; 35671da177e4SLinus Torvalds 3568badff6d0SArnaldo Carvalho de Melo skb_push(skb, HCI_ACL_HDR_SIZE); 3569badff6d0SArnaldo Carvalho de Melo skb_reset_transport_header(skb); 35709c70220bSArnaldo Carvalho de Melo hdr = (struct hci_acl_hdr *)skb_transport_header(skb); 3571aca3192cSYOSHIFUJI Hideaki hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags)); 3572aca3192cSYOSHIFUJI Hideaki hdr->dlen = cpu_to_le16(len); 35731da177e4SLinus Torvalds } 35741da177e4SLinus Torvalds 3575ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue, 357673d80debSLuiz Augusto von Dentz struct sk_buff *skb, __u16 flags) 35771da177e4SLinus Torvalds { 3578ee22be7eSAndrei Emeltchenko struct hci_conn *conn = chan->conn; 35791da177e4SLinus Torvalds struct hci_dev *hdev = conn->hdev; 35801da177e4SLinus Torvalds struct sk_buff *list; 35811da177e4SLinus Torvalds 3582087bfd99SGustavo Padovan skb->len = skb_headlen(skb); 3583087bfd99SGustavo Padovan skb->data_len = 0; 3584087bfd99SGustavo Padovan 3585087bfd99SGustavo Padovan bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; 3586204a6e54SAndrei Emeltchenko 3587204a6e54SAndrei Emeltchenko switch (hdev->dev_type) { 3588204a6e54SAndrei Emeltchenko case HCI_BREDR: 3589087bfd99SGustavo Padovan hci_add_acl_hdr(skb, conn->handle, flags); 3590204a6e54SAndrei Emeltchenko break; 3591204a6e54SAndrei Emeltchenko case HCI_AMP: 3592204a6e54SAndrei Emeltchenko hci_add_acl_hdr(skb, chan->handle, flags); 3593204a6e54SAndrei Emeltchenko break; 3594204a6e54SAndrei Emeltchenko default: 3595204a6e54SAndrei Emeltchenko BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type); 3596204a6e54SAndrei Emeltchenko return; 3597204a6e54SAndrei Emeltchenko } 3598087bfd99SGustavo Padovan 359970f23020SAndrei Emeltchenko list = skb_shinfo(skb)->frag_list; 360070f23020SAndrei Emeltchenko if (!list) { 36011da177e4SLinus Torvalds /* Non fragmented */ 36021da177e4SLinus Torvalds BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len); 36031da177e4SLinus Torvalds 360473d80debSLuiz Augusto von Dentz skb_queue_tail(queue, skb); 36051da177e4SLinus Torvalds } else { 36061da177e4SLinus Torvalds /* Fragmented */ 36071da177e4SLinus Torvalds BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len); 36081da177e4SLinus Torvalds 36091da177e4SLinus Torvalds skb_shinfo(skb)->frag_list = NULL; 36101da177e4SLinus Torvalds 36119cfd5a23SJukka Rissanen /* Queue all fragments atomically. We need to use spin_lock_bh 36129cfd5a23SJukka Rissanen * here because of 6LoWPAN links, as there this function is 36139cfd5a23SJukka Rissanen * called from softirq and using normal spin lock could cause 36149cfd5a23SJukka Rissanen * deadlocks. 36159cfd5a23SJukka Rissanen */ 36169cfd5a23SJukka Rissanen spin_lock_bh(&queue->lock); 36171da177e4SLinus Torvalds 361873d80debSLuiz Augusto von Dentz __skb_queue_tail(queue, skb); 3619e702112fSAndrei Emeltchenko 3620e702112fSAndrei Emeltchenko flags &= ~ACL_START; 3621e702112fSAndrei Emeltchenko flags |= ACL_CONT; 36221da177e4SLinus Torvalds do { 36231da177e4SLinus Torvalds skb = list; list = list->next; 36241da177e4SLinus Torvalds 36250d48d939SMarcel Holtmann bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; 3626e702112fSAndrei Emeltchenko hci_add_acl_hdr(skb, conn->handle, flags); 36271da177e4SLinus Torvalds 36281da177e4SLinus Torvalds BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len); 36291da177e4SLinus Torvalds 363073d80debSLuiz Augusto von Dentz __skb_queue_tail(queue, skb); 36311da177e4SLinus Torvalds } while (list); 36321da177e4SLinus Torvalds 36339cfd5a23SJukka Rissanen spin_unlock_bh(&queue->lock); 36341da177e4SLinus Torvalds } 363573d80debSLuiz Augusto von Dentz } 363673d80debSLuiz Augusto von Dentz 363773d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags) 363873d80debSLuiz Augusto von Dentz { 3639ee22be7eSAndrei Emeltchenko struct hci_dev *hdev = chan->conn->hdev; 364073d80debSLuiz Augusto von Dentz 3641f0e09510SAndrei Emeltchenko BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags); 364273d80debSLuiz Augusto von Dentz 3643ee22be7eSAndrei Emeltchenko hci_queue_acl(chan, &chan->data_q, skb, flags); 36441da177e4SLinus Torvalds 36453eff45eaSGustavo F. Padovan queue_work(hdev->workqueue, &hdev->tx_work); 36461da177e4SLinus Torvalds } 36471da177e4SLinus Torvalds 36481da177e4SLinus Torvalds /* Send SCO data */ 36490d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb) 36501da177e4SLinus Torvalds { 36511da177e4SLinus Torvalds struct hci_dev *hdev = conn->hdev; 36521da177e4SLinus Torvalds struct hci_sco_hdr hdr; 36531da177e4SLinus Torvalds 36541da177e4SLinus Torvalds BT_DBG("%s len %d", hdev->name, skb->len); 36551da177e4SLinus Torvalds 3656aca3192cSYOSHIFUJI Hideaki hdr.handle = cpu_to_le16(conn->handle); 36571da177e4SLinus Torvalds hdr.dlen = skb->len; 36581da177e4SLinus Torvalds 3659badff6d0SArnaldo Carvalho de Melo skb_push(skb, HCI_SCO_HDR_SIZE); 3660badff6d0SArnaldo Carvalho de Melo skb_reset_transport_header(skb); 36619c70220bSArnaldo Carvalho de Melo memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE); 36621da177e4SLinus Torvalds 36630d48d939SMarcel Holtmann bt_cb(skb)->pkt_type = HCI_SCODATA_PKT; 3664c78ae283SMarcel Holtmann 36651da177e4SLinus Torvalds skb_queue_tail(&conn->data_q, skb); 36663eff45eaSGustavo F. Padovan queue_work(hdev->workqueue, &hdev->tx_work); 36671da177e4SLinus Torvalds } 36681da177e4SLinus Torvalds 36691da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */ 36701da177e4SLinus Torvalds 36711da177e4SLinus Torvalds /* HCI Connection scheduler */ 36726039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type, 3673a8c5fb1aSGustavo Padovan int *quote) 36741da177e4SLinus Torvalds { 36751da177e4SLinus Torvalds struct hci_conn_hash *h = &hdev->conn_hash; 36768035ded4SLuiz Augusto von Dentz struct hci_conn *conn = NULL, *c; 3677abc5de8fSMikel Astiz unsigned int num = 0, min = ~0; 36781da177e4SLinus Torvalds 36791da177e4SLinus Torvalds /* We don't have to lock device here. Connections are always 36801da177e4SLinus Torvalds * added and removed with TX task disabled. */ 3681bf4c6325SGustavo F. Padovan 3682bf4c6325SGustavo F. Padovan rcu_read_lock(); 3683bf4c6325SGustavo F. Padovan 3684bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(c, &h->list, list) { 3685769be974SMarcel Holtmann if (c->type != type || skb_queue_empty(&c->data_q)) 36861da177e4SLinus Torvalds continue; 3687769be974SMarcel Holtmann 3688769be974SMarcel Holtmann if (c->state != BT_CONNECTED && c->state != BT_CONFIG) 3689769be974SMarcel Holtmann continue; 3690769be974SMarcel Holtmann 36911da177e4SLinus Torvalds num++; 36921da177e4SLinus Torvalds 36931da177e4SLinus Torvalds if (c->sent < min) { 36941da177e4SLinus Torvalds min = c->sent; 36951da177e4SLinus Torvalds conn = c; 36961da177e4SLinus Torvalds } 369752087a79SLuiz Augusto von Dentz 369852087a79SLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == num) 369952087a79SLuiz Augusto von Dentz break; 37001da177e4SLinus Torvalds } 37011da177e4SLinus Torvalds 3702bf4c6325SGustavo F. Padovan rcu_read_unlock(); 3703bf4c6325SGustavo F. Padovan 37041da177e4SLinus Torvalds if (conn) { 37056ed58ec5SVille Tervo int cnt, q; 37066ed58ec5SVille Tervo 37076ed58ec5SVille Tervo switch (conn->type) { 37086ed58ec5SVille Tervo case ACL_LINK: 37096ed58ec5SVille Tervo cnt = hdev->acl_cnt; 37106ed58ec5SVille Tervo break; 37116ed58ec5SVille Tervo case SCO_LINK: 37126ed58ec5SVille Tervo case ESCO_LINK: 37136ed58ec5SVille Tervo cnt = hdev->sco_cnt; 37146ed58ec5SVille Tervo break; 37156ed58ec5SVille Tervo case LE_LINK: 37166ed58ec5SVille Tervo cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt; 37176ed58ec5SVille Tervo break; 37186ed58ec5SVille Tervo default: 37196ed58ec5SVille Tervo cnt = 0; 37206ed58ec5SVille Tervo BT_ERR("Unknown link type"); 37216ed58ec5SVille Tervo } 37226ed58ec5SVille Tervo 37236ed58ec5SVille Tervo q = cnt / num; 37241da177e4SLinus Torvalds *quote = q ? q : 1; 37251da177e4SLinus Torvalds } else 37261da177e4SLinus Torvalds *quote = 0; 37271da177e4SLinus Torvalds 37281da177e4SLinus Torvalds BT_DBG("conn %p quote %d", conn, *quote); 37291da177e4SLinus Torvalds return conn; 37301da177e4SLinus Torvalds } 37311da177e4SLinus Torvalds 37326039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type) 37331da177e4SLinus Torvalds { 37341da177e4SLinus Torvalds struct hci_conn_hash *h = &hdev->conn_hash; 37351da177e4SLinus Torvalds struct hci_conn *c; 37361da177e4SLinus Torvalds 3737bae1f5d9SVille Tervo BT_ERR("%s link tx timeout", hdev->name); 37381da177e4SLinus Torvalds 3739bf4c6325SGustavo F. Padovan rcu_read_lock(); 3740bf4c6325SGustavo F. Padovan 37411da177e4SLinus Torvalds /* Kill stalled connections */ 3742bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(c, &h->list, list) { 3743bae1f5d9SVille Tervo if (c->type == type && c->sent) { 37446ed93dc6SAndrei Emeltchenko BT_ERR("%s killing stalled connection %pMR", 37456ed93dc6SAndrei Emeltchenko hdev->name, &c->dst); 3746bed71748SAndre Guedes hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM); 37471da177e4SLinus Torvalds } 37481da177e4SLinus Torvalds } 3749bf4c6325SGustavo F. Padovan 3750bf4c6325SGustavo F. Padovan rcu_read_unlock(); 37511da177e4SLinus Torvalds } 37521da177e4SLinus Torvalds 37536039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type, 375473d80debSLuiz Augusto von Dentz int *quote) 375573d80debSLuiz Augusto von Dentz { 375673d80debSLuiz Augusto von Dentz struct hci_conn_hash *h = &hdev->conn_hash; 375773d80debSLuiz Augusto von Dentz struct hci_chan *chan = NULL; 3758abc5de8fSMikel Astiz unsigned int num = 0, min = ~0, cur_prio = 0; 375973d80debSLuiz Augusto von Dentz struct hci_conn *conn; 376073d80debSLuiz Augusto von Dentz int cnt, q, conn_num = 0; 376173d80debSLuiz Augusto von Dentz 376273d80debSLuiz Augusto von Dentz BT_DBG("%s", hdev->name); 376373d80debSLuiz Augusto von Dentz 3764bf4c6325SGustavo F. Padovan rcu_read_lock(); 3765bf4c6325SGustavo F. Padovan 3766bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(conn, &h->list, list) { 376773d80debSLuiz Augusto von Dentz struct hci_chan *tmp; 376873d80debSLuiz Augusto von Dentz 376973d80debSLuiz Augusto von Dentz if (conn->type != type) 377073d80debSLuiz Augusto von Dentz continue; 377173d80debSLuiz Augusto von Dentz 377273d80debSLuiz Augusto von Dentz if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG) 377373d80debSLuiz Augusto von Dentz continue; 377473d80debSLuiz Augusto von Dentz 377573d80debSLuiz Augusto von Dentz conn_num++; 377673d80debSLuiz Augusto von Dentz 37778192edefSGustavo F. Padovan list_for_each_entry_rcu(tmp, &conn->chan_list, list) { 377873d80debSLuiz Augusto von Dentz struct sk_buff *skb; 377973d80debSLuiz Augusto von Dentz 378073d80debSLuiz Augusto von Dentz if (skb_queue_empty(&tmp->data_q)) 378173d80debSLuiz Augusto von Dentz continue; 378273d80debSLuiz Augusto von Dentz 378373d80debSLuiz Augusto von Dentz skb = skb_peek(&tmp->data_q); 378473d80debSLuiz Augusto von Dentz if (skb->priority < cur_prio) 378573d80debSLuiz Augusto von Dentz continue; 378673d80debSLuiz Augusto von Dentz 378773d80debSLuiz Augusto von Dentz if (skb->priority > cur_prio) { 378873d80debSLuiz Augusto von Dentz num = 0; 378973d80debSLuiz Augusto von Dentz min = ~0; 379073d80debSLuiz Augusto von Dentz cur_prio = skb->priority; 379173d80debSLuiz Augusto von Dentz } 379273d80debSLuiz Augusto von Dentz 379373d80debSLuiz Augusto von Dentz num++; 379473d80debSLuiz Augusto von Dentz 379573d80debSLuiz Augusto von Dentz if (conn->sent < min) { 379673d80debSLuiz Augusto von Dentz min = conn->sent; 379773d80debSLuiz Augusto von Dentz chan = tmp; 379873d80debSLuiz Augusto von Dentz } 379973d80debSLuiz Augusto von Dentz } 380073d80debSLuiz Augusto von Dentz 380173d80debSLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == conn_num) 380273d80debSLuiz Augusto von Dentz break; 380373d80debSLuiz Augusto von Dentz } 380473d80debSLuiz Augusto von Dentz 3805bf4c6325SGustavo F. Padovan rcu_read_unlock(); 3806bf4c6325SGustavo F. Padovan 380773d80debSLuiz Augusto von Dentz if (!chan) 380873d80debSLuiz Augusto von Dentz return NULL; 380973d80debSLuiz Augusto von Dentz 381073d80debSLuiz Augusto von Dentz switch (chan->conn->type) { 381173d80debSLuiz Augusto von Dentz case ACL_LINK: 381273d80debSLuiz Augusto von Dentz cnt = hdev->acl_cnt; 381373d80debSLuiz Augusto von Dentz break; 3814bd1eb66bSAndrei Emeltchenko case AMP_LINK: 3815bd1eb66bSAndrei Emeltchenko cnt = hdev->block_cnt; 3816bd1eb66bSAndrei Emeltchenko break; 381773d80debSLuiz Augusto von Dentz case SCO_LINK: 381873d80debSLuiz Augusto von Dentz case ESCO_LINK: 381973d80debSLuiz Augusto von Dentz cnt = hdev->sco_cnt; 382073d80debSLuiz Augusto von Dentz break; 382173d80debSLuiz Augusto von Dentz case LE_LINK: 382273d80debSLuiz Augusto von Dentz cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt; 382373d80debSLuiz Augusto von Dentz break; 382473d80debSLuiz Augusto von Dentz default: 382573d80debSLuiz Augusto von Dentz cnt = 0; 382673d80debSLuiz Augusto von Dentz BT_ERR("Unknown link type"); 382773d80debSLuiz Augusto von Dentz } 382873d80debSLuiz Augusto von Dentz 382973d80debSLuiz Augusto von Dentz q = cnt / num; 383073d80debSLuiz Augusto von Dentz *quote = q ? q : 1; 383173d80debSLuiz Augusto von Dentz BT_DBG("chan %p quote %d", chan, *quote); 383273d80debSLuiz Augusto von Dentz return chan; 383373d80debSLuiz Augusto von Dentz } 383473d80debSLuiz Augusto von Dentz 383502b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type) 383602b20f0bSLuiz Augusto von Dentz { 383702b20f0bSLuiz Augusto von Dentz struct hci_conn_hash *h = &hdev->conn_hash; 383802b20f0bSLuiz Augusto von Dentz struct hci_conn *conn; 383902b20f0bSLuiz Augusto von Dentz int num = 0; 384002b20f0bSLuiz Augusto von Dentz 384102b20f0bSLuiz Augusto von Dentz BT_DBG("%s", hdev->name); 384202b20f0bSLuiz Augusto von Dentz 3843bf4c6325SGustavo F. Padovan rcu_read_lock(); 3844bf4c6325SGustavo F. Padovan 3845bf4c6325SGustavo F. Padovan list_for_each_entry_rcu(conn, &h->list, list) { 384602b20f0bSLuiz Augusto von Dentz struct hci_chan *chan; 384702b20f0bSLuiz Augusto von Dentz 384802b20f0bSLuiz Augusto von Dentz if (conn->type != type) 384902b20f0bSLuiz Augusto von Dentz continue; 385002b20f0bSLuiz Augusto von Dentz 385102b20f0bSLuiz Augusto von Dentz if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG) 385202b20f0bSLuiz Augusto von Dentz continue; 385302b20f0bSLuiz Augusto von Dentz 385402b20f0bSLuiz Augusto von Dentz num++; 385502b20f0bSLuiz Augusto von Dentz 38568192edefSGustavo F. Padovan list_for_each_entry_rcu(chan, &conn->chan_list, list) { 385702b20f0bSLuiz Augusto von Dentz struct sk_buff *skb; 385802b20f0bSLuiz Augusto von Dentz 385902b20f0bSLuiz Augusto von Dentz if (chan->sent) { 386002b20f0bSLuiz Augusto von Dentz chan->sent = 0; 386102b20f0bSLuiz Augusto von Dentz continue; 386202b20f0bSLuiz Augusto von Dentz } 386302b20f0bSLuiz Augusto von Dentz 386402b20f0bSLuiz Augusto von Dentz if (skb_queue_empty(&chan->data_q)) 386502b20f0bSLuiz Augusto von Dentz continue; 386602b20f0bSLuiz Augusto von Dentz 386702b20f0bSLuiz Augusto von Dentz skb = skb_peek(&chan->data_q); 386802b20f0bSLuiz Augusto von Dentz if (skb->priority >= HCI_PRIO_MAX - 1) 386902b20f0bSLuiz Augusto von Dentz continue; 387002b20f0bSLuiz Augusto von Dentz 387102b20f0bSLuiz Augusto von Dentz skb->priority = HCI_PRIO_MAX - 1; 387202b20f0bSLuiz Augusto von Dentz 387302b20f0bSLuiz Augusto von Dentz BT_DBG("chan %p skb %p promoted to %d", chan, skb, 387402b20f0bSLuiz Augusto von Dentz skb->priority); 387502b20f0bSLuiz Augusto von Dentz } 387602b20f0bSLuiz Augusto von Dentz 387702b20f0bSLuiz Augusto von Dentz if (hci_conn_num(hdev, type) == num) 387802b20f0bSLuiz Augusto von Dentz break; 387902b20f0bSLuiz Augusto von Dentz } 3880bf4c6325SGustavo F. Padovan 3881bf4c6325SGustavo F. Padovan rcu_read_unlock(); 3882bf4c6325SGustavo F. Padovan 388302b20f0bSLuiz Augusto von Dentz } 388402b20f0bSLuiz Augusto von Dentz 3885b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb) 3886b71d385aSAndrei Emeltchenko { 3887b71d385aSAndrei Emeltchenko /* Calculate count of blocks used by this packet */ 3888b71d385aSAndrei Emeltchenko return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len); 3889b71d385aSAndrei Emeltchenko } 3890b71d385aSAndrei Emeltchenko 38916039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt) 38921da177e4SLinus Torvalds { 3893d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 38941da177e4SLinus Torvalds /* ACL tx timeout must be longer than maximum 38951da177e4SLinus Torvalds * link supervision timeout (40.9 seconds) */ 389663d2bc1bSAndrei Emeltchenko if (!cnt && time_after(jiffies, hdev->acl_last_tx + 38975f246e89SAndrei Emeltchenko HCI_ACL_TX_TIMEOUT)) 3898bae1f5d9SVille Tervo hci_link_tx_to(hdev, ACL_LINK); 38991da177e4SLinus Torvalds } 390063d2bc1bSAndrei Emeltchenko } 39011da177e4SLinus Torvalds 39026039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev) 390363d2bc1bSAndrei Emeltchenko { 390463d2bc1bSAndrei Emeltchenko unsigned int cnt = hdev->acl_cnt; 390563d2bc1bSAndrei Emeltchenko struct hci_chan *chan; 390663d2bc1bSAndrei Emeltchenko struct sk_buff *skb; 390763d2bc1bSAndrei Emeltchenko int quote; 390863d2bc1bSAndrei Emeltchenko 390963d2bc1bSAndrei Emeltchenko __check_timeout(hdev, cnt); 391004837f64SMarcel Holtmann 391173d80debSLuiz Augusto von Dentz while (hdev->acl_cnt && 391273d80debSLuiz Augusto von Dentz (chan = hci_chan_sent(hdev, ACL_LINK, "e))) { 3913ec1cce24SLuiz Augusto von Dentz u32 priority = (skb_peek(&chan->data_q))->priority; 3914ec1cce24SLuiz Augusto von Dentz while (quote-- && (skb = skb_peek(&chan->data_q))) { 391573d80debSLuiz Augusto von Dentz BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 391673d80debSLuiz Augusto von Dentz skb->len, skb->priority); 391773d80debSLuiz Augusto von Dentz 3918ec1cce24SLuiz Augusto von Dentz /* Stop if priority has changed */ 3919ec1cce24SLuiz Augusto von Dentz if (skb->priority < priority) 3920ec1cce24SLuiz Augusto von Dentz break; 3921ec1cce24SLuiz Augusto von Dentz 3922ec1cce24SLuiz Augusto von Dentz skb = skb_dequeue(&chan->data_q); 3923ec1cce24SLuiz Augusto von Dentz 392473d80debSLuiz Augusto von Dentz hci_conn_enter_active_mode(chan->conn, 392573d80debSLuiz Augusto von Dentz bt_cb(skb)->force_active); 392604837f64SMarcel Holtmann 392757d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 39281da177e4SLinus Torvalds hdev->acl_last_tx = jiffies; 39291da177e4SLinus Torvalds 39301da177e4SLinus Torvalds hdev->acl_cnt--; 393173d80debSLuiz Augusto von Dentz chan->sent++; 393273d80debSLuiz Augusto von Dentz chan->conn->sent++; 39331da177e4SLinus Torvalds } 39341da177e4SLinus Torvalds } 393502b20f0bSLuiz Augusto von Dentz 393602b20f0bSLuiz Augusto von Dentz if (cnt != hdev->acl_cnt) 393702b20f0bSLuiz Augusto von Dentz hci_prio_recalculate(hdev, ACL_LINK); 39381da177e4SLinus Torvalds } 39391da177e4SLinus Torvalds 39406039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev) 3941b71d385aSAndrei Emeltchenko { 394263d2bc1bSAndrei Emeltchenko unsigned int cnt = hdev->block_cnt; 3943b71d385aSAndrei Emeltchenko struct hci_chan *chan; 3944b71d385aSAndrei Emeltchenko struct sk_buff *skb; 3945b71d385aSAndrei Emeltchenko int quote; 3946bd1eb66bSAndrei Emeltchenko u8 type; 3947b71d385aSAndrei Emeltchenko 394863d2bc1bSAndrei Emeltchenko __check_timeout(hdev, cnt); 3949b71d385aSAndrei Emeltchenko 3950bd1eb66bSAndrei Emeltchenko BT_DBG("%s", hdev->name); 3951bd1eb66bSAndrei Emeltchenko 3952bd1eb66bSAndrei Emeltchenko if (hdev->dev_type == HCI_AMP) 3953bd1eb66bSAndrei Emeltchenko type = AMP_LINK; 3954bd1eb66bSAndrei Emeltchenko else 3955bd1eb66bSAndrei Emeltchenko type = ACL_LINK; 3956bd1eb66bSAndrei Emeltchenko 3957b71d385aSAndrei Emeltchenko while (hdev->block_cnt > 0 && 3958bd1eb66bSAndrei Emeltchenko (chan = hci_chan_sent(hdev, type, "e))) { 3959b71d385aSAndrei Emeltchenko u32 priority = (skb_peek(&chan->data_q))->priority; 3960b71d385aSAndrei Emeltchenko while (quote > 0 && (skb = skb_peek(&chan->data_q))) { 3961b71d385aSAndrei Emeltchenko int blocks; 3962b71d385aSAndrei Emeltchenko 3963b71d385aSAndrei Emeltchenko BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 3964b71d385aSAndrei Emeltchenko skb->len, skb->priority); 3965b71d385aSAndrei Emeltchenko 3966b71d385aSAndrei Emeltchenko /* Stop if priority has changed */ 3967b71d385aSAndrei Emeltchenko if (skb->priority < priority) 3968b71d385aSAndrei Emeltchenko break; 3969b71d385aSAndrei Emeltchenko 3970b71d385aSAndrei Emeltchenko skb = skb_dequeue(&chan->data_q); 3971b71d385aSAndrei Emeltchenko 3972b71d385aSAndrei Emeltchenko blocks = __get_blocks(hdev, skb); 3973b71d385aSAndrei Emeltchenko if (blocks > hdev->block_cnt) 3974b71d385aSAndrei Emeltchenko return; 3975b71d385aSAndrei Emeltchenko 3976b71d385aSAndrei Emeltchenko hci_conn_enter_active_mode(chan->conn, 3977b71d385aSAndrei Emeltchenko bt_cb(skb)->force_active); 3978b71d385aSAndrei Emeltchenko 397957d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 3980b71d385aSAndrei Emeltchenko hdev->acl_last_tx = jiffies; 3981b71d385aSAndrei Emeltchenko 3982b71d385aSAndrei Emeltchenko hdev->block_cnt -= blocks; 3983b71d385aSAndrei Emeltchenko quote -= blocks; 3984b71d385aSAndrei Emeltchenko 3985b71d385aSAndrei Emeltchenko chan->sent += blocks; 3986b71d385aSAndrei Emeltchenko chan->conn->sent += blocks; 3987b71d385aSAndrei Emeltchenko } 3988b71d385aSAndrei Emeltchenko } 3989b71d385aSAndrei Emeltchenko 3990b71d385aSAndrei Emeltchenko if (cnt != hdev->block_cnt) 3991bd1eb66bSAndrei Emeltchenko hci_prio_recalculate(hdev, type); 3992b71d385aSAndrei Emeltchenko } 3993b71d385aSAndrei Emeltchenko 39946039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev) 3995b71d385aSAndrei Emeltchenko { 3996b71d385aSAndrei Emeltchenko BT_DBG("%s", hdev->name); 3997b71d385aSAndrei Emeltchenko 3998bd1eb66bSAndrei Emeltchenko /* No ACL link over BR/EDR controller */ 3999bd1eb66bSAndrei Emeltchenko if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR) 4000bd1eb66bSAndrei Emeltchenko return; 4001bd1eb66bSAndrei Emeltchenko 4002bd1eb66bSAndrei Emeltchenko /* No AMP link over AMP controller */ 4003bd1eb66bSAndrei Emeltchenko if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP) 4004b71d385aSAndrei Emeltchenko return; 4005b71d385aSAndrei Emeltchenko 4006b71d385aSAndrei Emeltchenko switch (hdev->flow_ctl_mode) { 4007b71d385aSAndrei Emeltchenko case HCI_FLOW_CTL_MODE_PACKET_BASED: 4008b71d385aSAndrei Emeltchenko hci_sched_acl_pkt(hdev); 4009b71d385aSAndrei Emeltchenko break; 4010b71d385aSAndrei Emeltchenko 4011b71d385aSAndrei Emeltchenko case HCI_FLOW_CTL_MODE_BLOCK_BASED: 4012b71d385aSAndrei Emeltchenko hci_sched_acl_blk(hdev); 4013b71d385aSAndrei Emeltchenko break; 4014b71d385aSAndrei Emeltchenko } 4015b71d385aSAndrei Emeltchenko } 4016b71d385aSAndrei Emeltchenko 40171da177e4SLinus Torvalds /* Schedule SCO */ 40186039aa73SGustavo Padovan static void hci_sched_sco(struct hci_dev *hdev) 40191da177e4SLinus Torvalds { 40201da177e4SLinus Torvalds struct hci_conn *conn; 40211da177e4SLinus Torvalds struct sk_buff *skb; 40221da177e4SLinus Torvalds int quote; 40231da177e4SLinus Torvalds 40241da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 40251da177e4SLinus Torvalds 402652087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, SCO_LINK)) 402752087a79SLuiz Augusto von Dentz return; 402852087a79SLuiz Augusto von Dentz 40291da177e4SLinus Torvalds while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, "e))) { 40301da177e4SLinus Torvalds while (quote-- && (skb = skb_dequeue(&conn->data_q))) { 40311da177e4SLinus Torvalds BT_DBG("skb %p len %d", skb, skb->len); 403257d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 40331da177e4SLinus Torvalds 40341da177e4SLinus Torvalds conn->sent++; 40351da177e4SLinus Torvalds if (conn->sent == ~0) 40361da177e4SLinus Torvalds conn->sent = 0; 40371da177e4SLinus Torvalds } 40381da177e4SLinus Torvalds } 40391da177e4SLinus Torvalds } 40401da177e4SLinus Torvalds 40416039aa73SGustavo Padovan static void hci_sched_esco(struct hci_dev *hdev) 4042b6a0dc82SMarcel Holtmann { 4043b6a0dc82SMarcel Holtmann struct hci_conn *conn; 4044b6a0dc82SMarcel Holtmann struct sk_buff *skb; 4045b6a0dc82SMarcel Holtmann int quote; 4046b6a0dc82SMarcel Holtmann 4047b6a0dc82SMarcel Holtmann BT_DBG("%s", hdev->name); 4048b6a0dc82SMarcel Holtmann 404952087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, ESCO_LINK)) 405052087a79SLuiz Augusto von Dentz return; 405152087a79SLuiz Augusto von Dentz 40528fc9ced3SGustavo Padovan while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK, 40538fc9ced3SGustavo Padovan "e))) { 4054b6a0dc82SMarcel Holtmann while (quote-- && (skb = skb_dequeue(&conn->data_q))) { 4055b6a0dc82SMarcel Holtmann BT_DBG("skb %p len %d", skb, skb->len); 405657d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 4057b6a0dc82SMarcel Holtmann 4058b6a0dc82SMarcel Holtmann conn->sent++; 4059b6a0dc82SMarcel Holtmann if (conn->sent == ~0) 4060b6a0dc82SMarcel Holtmann conn->sent = 0; 4061b6a0dc82SMarcel Holtmann } 4062b6a0dc82SMarcel Holtmann } 4063b6a0dc82SMarcel Holtmann } 4064b6a0dc82SMarcel Holtmann 40656039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev) 40666ed58ec5SVille Tervo { 406773d80debSLuiz Augusto von Dentz struct hci_chan *chan; 40686ed58ec5SVille Tervo struct sk_buff *skb; 406902b20f0bSLuiz Augusto von Dentz int quote, cnt, tmp; 40706ed58ec5SVille Tervo 40716ed58ec5SVille Tervo BT_DBG("%s", hdev->name); 40726ed58ec5SVille Tervo 407352087a79SLuiz Augusto von Dentz if (!hci_conn_num(hdev, LE_LINK)) 407452087a79SLuiz Augusto von Dentz return; 407552087a79SLuiz Augusto von Dentz 4076d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { 40776ed58ec5SVille Tervo /* LE tx timeout must be longer than maximum 40786ed58ec5SVille Tervo * link supervision timeout (40.9 seconds) */ 4079bae1f5d9SVille Tervo if (!hdev->le_cnt && hdev->le_pkts && 40806ed58ec5SVille Tervo time_after(jiffies, hdev->le_last_tx + HZ * 45)) 4081bae1f5d9SVille Tervo hci_link_tx_to(hdev, LE_LINK); 40826ed58ec5SVille Tervo } 40836ed58ec5SVille Tervo 40846ed58ec5SVille Tervo cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt; 408502b20f0bSLuiz Augusto von Dentz tmp = cnt; 408673d80debSLuiz Augusto von Dentz while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, "e))) { 4087ec1cce24SLuiz Augusto von Dentz u32 priority = (skb_peek(&chan->data_q))->priority; 4088ec1cce24SLuiz Augusto von Dentz while (quote-- && (skb = skb_peek(&chan->data_q))) { 408973d80debSLuiz Augusto von Dentz BT_DBG("chan %p skb %p len %d priority %u", chan, skb, 409073d80debSLuiz Augusto von Dentz skb->len, skb->priority); 40916ed58ec5SVille Tervo 4092ec1cce24SLuiz Augusto von Dentz /* Stop if priority has changed */ 4093ec1cce24SLuiz Augusto von Dentz if (skb->priority < priority) 4094ec1cce24SLuiz Augusto von Dentz break; 4095ec1cce24SLuiz Augusto von Dentz 4096ec1cce24SLuiz Augusto von Dentz skb = skb_dequeue(&chan->data_q); 4097ec1cce24SLuiz Augusto von Dentz 409857d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 40996ed58ec5SVille Tervo hdev->le_last_tx = jiffies; 41006ed58ec5SVille Tervo 41016ed58ec5SVille Tervo cnt--; 410273d80debSLuiz Augusto von Dentz chan->sent++; 410373d80debSLuiz Augusto von Dentz chan->conn->sent++; 41046ed58ec5SVille Tervo } 41056ed58ec5SVille Tervo } 410673d80debSLuiz Augusto von Dentz 41076ed58ec5SVille Tervo if (hdev->le_pkts) 41086ed58ec5SVille Tervo hdev->le_cnt = cnt; 41096ed58ec5SVille Tervo else 41106ed58ec5SVille Tervo hdev->acl_cnt = cnt; 411102b20f0bSLuiz Augusto von Dentz 411202b20f0bSLuiz Augusto von Dentz if (cnt != tmp) 411302b20f0bSLuiz Augusto von Dentz hci_prio_recalculate(hdev, LE_LINK); 41146ed58ec5SVille Tervo } 41156ed58ec5SVille Tervo 41163eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work) 41171da177e4SLinus Torvalds { 41183eff45eaSGustavo F. Padovan struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work); 41191da177e4SLinus Torvalds struct sk_buff *skb; 41201da177e4SLinus Torvalds 41216ed58ec5SVille Tervo BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt, 41226ed58ec5SVille Tervo hdev->sco_cnt, hdev->le_cnt); 41231da177e4SLinus Torvalds 4124d7a5a11dSMarcel Holtmann if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 41251da177e4SLinus Torvalds /* Schedule queues and send stuff to HCI driver */ 41261da177e4SLinus Torvalds hci_sched_acl(hdev); 41271da177e4SLinus Torvalds hci_sched_sco(hdev); 4128b6a0dc82SMarcel Holtmann hci_sched_esco(hdev); 41296ed58ec5SVille Tervo hci_sched_le(hdev); 413052de599eSMarcel Holtmann } 41316ed58ec5SVille Tervo 41321da177e4SLinus Torvalds /* Send next queued raw (unknown type) packet */ 41331da177e4SLinus Torvalds while ((skb = skb_dequeue(&hdev->raw_q))) 413457d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 41351da177e4SLinus Torvalds } 41361da177e4SLinus Torvalds 413725985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */ 41381da177e4SLinus Torvalds 41391da177e4SLinus Torvalds /* ACL data packet */ 41406039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) 41411da177e4SLinus Torvalds { 41421da177e4SLinus Torvalds struct hci_acl_hdr *hdr = (void *) skb->data; 41431da177e4SLinus Torvalds struct hci_conn *conn; 41441da177e4SLinus Torvalds __u16 handle, flags; 41451da177e4SLinus Torvalds 41461da177e4SLinus Torvalds skb_pull(skb, HCI_ACL_HDR_SIZE); 41471da177e4SLinus Torvalds 41481da177e4SLinus Torvalds handle = __le16_to_cpu(hdr->handle); 41491da177e4SLinus Torvalds flags = hci_flags(handle); 41501da177e4SLinus Torvalds handle = hci_handle(handle); 41511da177e4SLinus Torvalds 4152f0e09510SAndrei Emeltchenko BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len, 4153a8c5fb1aSGustavo Padovan handle, flags); 41541da177e4SLinus Torvalds 41551da177e4SLinus Torvalds hdev->stat.acl_rx++; 41561da177e4SLinus Torvalds 41571da177e4SLinus Torvalds hci_dev_lock(hdev); 41581da177e4SLinus Torvalds conn = hci_conn_hash_lookup_handle(hdev, handle); 41591da177e4SLinus Torvalds hci_dev_unlock(hdev); 41601da177e4SLinus Torvalds 41611da177e4SLinus Torvalds if (conn) { 416265983fc7SMat Martineau hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); 416304837f64SMarcel Holtmann 41641da177e4SLinus Torvalds /* Send to upper protocol */ 4165686ebf28SUlisses Furquim l2cap_recv_acldata(conn, skb, flags); 41661da177e4SLinus Torvalds return; 41671da177e4SLinus Torvalds } else { 41681da177e4SLinus Torvalds BT_ERR("%s ACL packet for unknown connection handle %d", 41691da177e4SLinus Torvalds hdev->name, handle); 41701da177e4SLinus Torvalds } 41711da177e4SLinus Torvalds 41721da177e4SLinus Torvalds kfree_skb(skb); 41731da177e4SLinus Torvalds } 41741da177e4SLinus Torvalds 41751da177e4SLinus Torvalds /* SCO data packet */ 41766039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb) 41771da177e4SLinus Torvalds { 41781da177e4SLinus Torvalds struct hci_sco_hdr *hdr = (void *) skb->data; 41791da177e4SLinus Torvalds struct hci_conn *conn; 41801da177e4SLinus Torvalds __u16 handle; 41811da177e4SLinus Torvalds 41821da177e4SLinus Torvalds skb_pull(skb, HCI_SCO_HDR_SIZE); 41831da177e4SLinus Torvalds 41841da177e4SLinus Torvalds handle = __le16_to_cpu(hdr->handle); 41851da177e4SLinus Torvalds 4186f0e09510SAndrei Emeltchenko BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle); 41871da177e4SLinus Torvalds 41881da177e4SLinus Torvalds hdev->stat.sco_rx++; 41891da177e4SLinus Torvalds 41901da177e4SLinus Torvalds hci_dev_lock(hdev); 41911da177e4SLinus Torvalds conn = hci_conn_hash_lookup_handle(hdev, handle); 41921da177e4SLinus Torvalds hci_dev_unlock(hdev); 41931da177e4SLinus Torvalds 41941da177e4SLinus Torvalds if (conn) { 41951da177e4SLinus Torvalds /* Send to upper protocol */ 4196686ebf28SUlisses Furquim sco_recv_scodata(conn, skb); 41971da177e4SLinus Torvalds return; 41981da177e4SLinus Torvalds } else { 41991da177e4SLinus Torvalds BT_ERR("%s SCO packet for unknown connection handle %d", 42001da177e4SLinus Torvalds hdev->name, handle); 42011da177e4SLinus Torvalds } 42021da177e4SLinus Torvalds 42031da177e4SLinus Torvalds kfree_skb(skb); 42041da177e4SLinus Torvalds } 42051da177e4SLinus Torvalds 42069238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev) 42079238f36aSJohan Hedberg { 42089238f36aSJohan Hedberg struct sk_buff *skb; 42099238f36aSJohan Hedberg 42109238f36aSJohan Hedberg skb = skb_peek(&hdev->cmd_q); 42119238f36aSJohan Hedberg if (!skb) 42129238f36aSJohan Hedberg return true; 42139238f36aSJohan Hedberg 4214db6e3e8dSJohan Hedberg return bt_cb(skb)->req.start; 42159238f36aSJohan Hedberg } 42169238f36aSJohan Hedberg 421742c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev) 421842c6b129SJohan Hedberg { 421942c6b129SJohan Hedberg struct hci_command_hdr *sent; 422042c6b129SJohan Hedberg struct sk_buff *skb; 422142c6b129SJohan Hedberg u16 opcode; 422242c6b129SJohan Hedberg 422342c6b129SJohan Hedberg if (!hdev->sent_cmd) 422442c6b129SJohan Hedberg return; 422542c6b129SJohan Hedberg 422642c6b129SJohan Hedberg sent = (void *) hdev->sent_cmd->data; 422742c6b129SJohan Hedberg opcode = __le16_to_cpu(sent->opcode); 422842c6b129SJohan Hedberg if (opcode == HCI_OP_RESET) 422942c6b129SJohan Hedberg return; 423042c6b129SJohan Hedberg 423142c6b129SJohan Hedberg skb = skb_clone(hdev->sent_cmd, GFP_KERNEL); 423242c6b129SJohan Hedberg if (!skb) 423342c6b129SJohan Hedberg return; 423442c6b129SJohan Hedberg 423542c6b129SJohan Hedberg skb_queue_head(&hdev->cmd_q, skb); 423642c6b129SJohan Hedberg queue_work(hdev->workqueue, &hdev->cmd_work); 423742c6b129SJohan Hedberg } 423842c6b129SJohan Hedberg 4239e6214487SJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status, 4240e6214487SJohan Hedberg hci_req_complete_t *req_complete, 4241e6214487SJohan Hedberg hci_req_complete_skb_t *req_complete_skb) 42429238f36aSJohan Hedberg { 42439238f36aSJohan Hedberg struct sk_buff *skb; 42449238f36aSJohan Hedberg unsigned long flags; 42459238f36aSJohan Hedberg 42469238f36aSJohan Hedberg BT_DBG("opcode 0x%04x status 0x%02x", opcode, status); 42479238f36aSJohan Hedberg 424842c6b129SJohan Hedberg /* If the completed command doesn't match the last one that was 424942c6b129SJohan Hedberg * sent we need to do special handling of it. 42509238f36aSJohan Hedberg */ 425142c6b129SJohan Hedberg if (!hci_sent_cmd_data(hdev, opcode)) { 425242c6b129SJohan Hedberg /* Some CSR based controllers generate a spontaneous 425342c6b129SJohan Hedberg * reset complete event during init and any pending 425442c6b129SJohan Hedberg * command will never be completed. In such a case we 425542c6b129SJohan Hedberg * need to resend whatever was the last sent 425642c6b129SJohan Hedberg * command. 425742c6b129SJohan Hedberg */ 425842c6b129SJohan Hedberg if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET) 425942c6b129SJohan Hedberg hci_resend_last(hdev); 426042c6b129SJohan Hedberg 42619238f36aSJohan Hedberg return; 426242c6b129SJohan Hedberg } 42639238f36aSJohan Hedberg 42649238f36aSJohan Hedberg /* If the command succeeded and there's still more commands in 42659238f36aSJohan Hedberg * this request the request is not yet complete. 42669238f36aSJohan Hedberg */ 42679238f36aSJohan Hedberg if (!status && !hci_req_is_complete(hdev)) 42689238f36aSJohan Hedberg return; 42699238f36aSJohan Hedberg 42709238f36aSJohan Hedberg /* If this was the last command in a request the complete 42719238f36aSJohan Hedberg * callback would be found in hdev->sent_cmd instead of the 42729238f36aSJohan Hedberg * command queue (hdev->cmd_q). 42739238f36aSJohan Hedberg */ 4274e6214487SJohan Hedberg if (bt_cb(hdev->sent_cmd)->req.complete) { 4275e6214487SJohan Hedberg *req_complete = bt_cb(hdev->sent_cmd)->req.complete; 4276e6214487SJohan Hedberg return; 42779238f36aSJohan Hedberg } 4278e6214487SJohan Hedberg 4279e6214487SJohan Hedberg if (bt_cb(hdev->sent_cmd)->req.complete_skb) { 4280e6214487SJohan Hedberg *req_complete_skb = bt_cb(hdev->sent_cmd)->req.complete_skb; 4281e6214487SJohan Hedberg return; 428253e21fbcSJohan Hedberg } 42839238f36aSJohan Hedberg 42849238f36aSJohan Hedberg /* Remove all pending commands belonging to this request */ 42859238f36aSJohan Hedberg spin_lock_irqsave(&hdev->cmd_q.lock, flags); 42869238f36aSJohan Hedberg while ((skb = __skb_dequeue(&hdev->cmd_q))) { 4287db6e3e8dSJohan Hedberg if (bt_cb(skb)->req.start) { 42889238f36aSJohan Hedberg __skb_queue_head(&hdev->cmd_q, skb); 42899238f36aSJohan Hedberg break; 42909238f36aSJohan Hedberg } 42919238f36aSJohan Hedberg 4292e6214487SJohan Hedberg *req_complete = bt_cb(skb)->req.complete; 4293e6214487SJohan Hedberg *req_complete_skb = bt_cb(skb)->req.complete_skb; 42949238f36aSJohan Hedberg kfree_skb(skb); 42959238f36aSJohan Hedberg } 42969238f36aSJohan Hedberg spin_unlock_irqrestore(&hdev->cmd_q.lock, flags); 42979238f36aSJohan Hedberg } 42989238f36aSJohan Hedberg 4299b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work) 43001da177e4SLinus Torvalds { 4301b78752ccSMarcel Holtmann struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work); 43021da177e4SLinus Torvalds struct sk_buff *skb; 43031da177e4SLinus Torvalds 43041da177e4SLinus Torvalds BT_DBG("%s", hdev->name); 43051da177e4SLinus Torvalds 43061da177e4SLinus Torvalds while ((skb = skb_dequeue(&hdev->rx_q))) { 4307cd82e61cSMarcel Holtmann /* Send copy to monitor */ 4308cd82e61cSMarcel Holtmann hci_send_to_monitor(hdev, skb); 4309cd82e61cSMarcel Holtmann 43101da177e4SLinus Torvalds if (atomic_read(&hdev->promisc)) { 43111da177e4SLinus Torvalds /* Send copy to the sockets */ 4312470fe1b5SMarcel Holtmann hci_send_to_sock(hdev, skb); 43131da177e4SLinus Torvalds } 43141da177e4SLinus Torvalds 4315d7a5a11dSMarcel Holtmann if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { 43161da177e4SLinus Torvalds kfree_skb(skb); 43171da177e4SLinus Torvalds continue; 43181da177e4SLinus Torvalds } 43191da177e4SLinus Torvalds 43201da177e4SLinus Torvalds if (test_bit(HCI_INIT, &hdev->flags)) { 43211da177e4SLinus Torvalds /* Don't process data packets in this states. */ 43220d48d939SMarcel Holtmann switch (bt_cb(skb)->pkt_type) { 43231da177e4SLinus Torvalds case HCI_ACLDATA_PKT: 43241da177e4SLinus Torvalds case HCI_SCODATA_PKT: 43251da177e4SLinus Torvalds kfree_skb(skb); 43261da177e4SLinus Torvalds continue; 43273ff50b79SStephen Hemminger } 43281da177e4SLinus Torvalds } 43291da177e4SLinus Torvalds 43301da177e4SLinus Torvalds /* Process frame */ 43310d48d939SMarcel Holtmann switch (bt_cb(skb)->pkt_type) { 43321da177e4SLinus Torvalds case HCI_EVENT_PKT: 4333b78752ccSMarcel Holtmann BT_DBG("%s Event packet", hdev->name); 43341da177e4SLinus Torvalds hci_event_packet(hdev, skb); 43351da177e4SLinus Torvalds break; 43361da177e4SLinus Torvalds 43371da177e4SLinus Torvalds case HCI_ACLDATA_PKT: 43381da177e4SLinus Torvalds BT_DBG("%s ACL data packet", hdev->name); 43391da177e4SLinus Torvalds hci_acldata_packet(hdev, skb); 43401da177e4SLinus Torvalds break; 43411da177e4SLinus Torvalds 43421da177e4SLinus Torvalds case HCI_SCODATA_PKT: 43431da177e4SLinus Torvalds BT_DBG("%s SCO data packet", hdev->name); 43441da177e4SLinus Torvalds hci_scodata_packet(hdev, skb); 43451da177e4SLinus Torvalds break; 43461da177e4SLinus Torvalds 43471da177e4SLinus Torvalds default: 43481da177e4SLinus Torvalds kfree_skb(skb); 43491da177e4SLinus Torvalds break; 43501da177e4SLinus Torvalds } 43511da177e4SLinus Torvalds } 43521da177e4SLinus Torvalds } 43531da177e4SLinus Torvalds 4354c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work) 43551da177e4SLinus Torvalds { 4356c347b765SGustavo F. Padovan struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work); 43571da177e4SLinus Torvalds struct sk_buff *skb; 43581da177e4SLinus Torvalds 43592104786bSAndrei Emeltchenko BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name, 43602104786bSAndrei Emeltchenko atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q)); 43611da177e4SLinus Torvalds 43621da177e4SLinus Torvalds /* Send queued commands */ 43635a08ecceSAndrei Emeltchenko if (atomic_read(&hdev->cmd_cnt)) { 43645a08ecceSAndrei Emeltchenko skb = skb_dequeue(&hdev->cmd_q); 43655a08ecceSAndrei Emeltchenko if (!skb) 43665a08ecceSAndrei Emeltchenko return; 43675a08ecceSAndrei Emeltchenko 43681da177e4SLinus Torvalds kfree_skb(hdev->sent_cmd); 43691da177e4SLinus Torvalds 4370a675d7f1SMarcel Holtmann hdev->sent_cmd = skb_clone(skb, GFP_KERNEL); 437170f23020SAndrei Emeltchenko if (hdev->sent_cmd) { 43721da177e4SLinus Torvalds atomic_dec(&hdev->cmd_cnt); 437357d17d70SMarcel Holtmann hci_send_frame(hdev, skb); 43747bdb8a5cSSzymon Janc if (test_bit(HCI_RESET, &hdev->flags)) 437565cc2b49SMarcel Holtmann cancel_delayed_work(&hdev->cmd_timer); 43767bdb8a5cSSzymon Janc else 437765cc2b49SMarcel Holtmann schedule_delayed_work(&hdev->cmd_timer, 437865cc2b49SMarcel Holtmann HCI_CMD_TIMEOUT); 43791da177e4SLinus Torvalds } else { 43801da177e4SLinus Torvalds skb_queue_head(&hdev->cmd_q, skb); 4381c347b765SGustavo F. Padovan queue_work(hdev->workqueue, &hdev->cmd_work); 43821da177e4SLinus Torvalds } 43831da177e4SLinus Torvalds } 43841da177e4SLinus Torvalds } 4385