xref: /openbmc/linux/net/bluetooth/hci_core.c (revision 5d4e7e8d)
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>
301da177e4SLinus Torvalds 
31611b30f7SMarcel Holtmann #include <linux/rfkill.h>
321da177e4SLinus Torvalds 
331da177e4SLinus Torvalds #include <net/bluetooth/bluetooth.h>
341da177e4SLinus Torvalds #include <net/bluetooth/hci_core.h>
351da177e4SLinus Torvalds 
36b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work);
37c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work);
383eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work);
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds /* HCI device list */
411da177e4SLinus Torvalds LIST_HEAD(hci_dev_list);
421da177e4SLinus Torvalds DEFINE_RWLOCK(hci_dev_list_lock);
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds /* HCI callback list */
451da177e4SLinus Torvalds LIST_HEAD(hci_cb_list);
461da177e4SLinus Torvalds DEFINE_RWLOCK(hci_cb_list_lock);
471da177e4SLinus Torvalds 
483df92b31SSasha Levin /* HCI ID Numbering */
493df92b31SSasha Levin static DEFINE_IDA(hci_index_ida);
503df92b31SSasha Levin 
511da177e4SLinus Torvalds /* ---- HCI notifications ---- */
521da177e4SLinus Torvalds 
536516455dSMarcel Holtmann static void hci_notify(struct hci_dev *hdev, int event)
541da177e4SLinus Torvalds {
55040030efSMarcel Holtmann 	hci_sock_dev_event(hdev, event);
561da177e4SLinus Torvalds }
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds /* ---- HCI requests ---- */
591da177e4SLinus Torvalds 
6042c6b129SJohan Hedberg static void hci_req_sync_complete(struct hci_dev *hdev, u8 result)
611da177e4SLinus Torvalds {
6242c6b129SJohan Hedberg 	BT_DBG("%s result 0x%2.2x", hdev->name, result);
6375fb0e32SJohan Hedberg 
641da177e4SLinus Torvalds 	if (hdev->req_status == HCI_REQ_PEND) {
651da177e4SLinus Torvalds 		hdev->req_result = result;
661da177e4SLinus Torvalds 		hdev->req_status = HCI_REQ_DONE;
671da177e4SLinus Torvalds 		wake_up_interruptible(&hdev->req_wait_q);
681da177e4SLinus Torvalds 	}
691da177e4SLinus Torvalds }
701da177e4SLinus Torvalds 
711da177e4SLinus Torvalds static void hci_req_cancel(struct hci_dev *hdev, int err)
721da177e4SLinus Torvalds {
731da177e4SLinus Torvalds 	BT_DBG("%s err 0x%2.2x", hdev->name, err);
741da177e4SLinus Torvalds 
751da177e4SLinus Torvalds 	if (hdev->req_status == HCI_REQ_PEND) {
761da177e4SLinus Torvalds 		hdev->req_result = err;
771da177e4SLinus Torvalds 		hdev->req_status = HCI_REQ_CANCELED;
781da177e4SLinus Torvalds 		wake_up_interruptible(&hdev->req_wait_q);
791da177e4SLinus Torvalds 	}
801da177e4SLinus Torvalds }
811da177e4SLinus Torvalds 
8277a63e0aSFengguang Wu static struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
8377a63e0aSFengguang Wu 					    u8 event)
8475e84b7cSJohan Hedberg {
8575e84b7cSJohan Hedberg 	struct hci_ev_cmd_complete *ev;
8675e84b7cSJohan Hedberg 	struct hci_event_hdr *hdr;
8775e84b7cSJohan Hedberg 	struct sk_buff *skb;
8875e84b7cSJohan Hedberg 
8975e84b7cSJohan Hedberg 	hci_dev_lock(hdev);
9075e84b7cSJohan Hedberg 
9175e84b7cSJohan Hedberg 	skb = hdev->recv_evt;
9275e84b7cSJohan Hedberg 	hdev->recv_evt = NULL;
9375e84b7cSJohan Hedberg 
9475e84b7cSJohan Hedberg 	hci_dev_unlock(hdev);
9575e84b7cSJohan Hedberg 
9675e84b7cSJohan Hedberg 	if (!skb)
9775e84b7cSJohan Hedberg 		return ERR_PTR(-ENODATA);
9875e84b7cSJohan Hedberg 
9975e84b7cSJohan Hedberg 	if (skb->len < sizeof(*hdr)) {
10075e84b7cSJohan Hedberg 		BT_ERR("Too short HCI event");
10175e84b7cSJohan Hedberg 		goto failed;
10275e84b7cSJohan Hedberg 	}
10375e84b7cSJohan Hedberg 
10475e84b7cSJohan Hedberg 	hdr = (void *) skb->data;
10575e84b7cSJohan Hedberg 	skb_pull(skb, HCI_EVENT_HDR_SIZE);
10675e84b7cSJohan Hedberg 
1077b1abbbeSJohan Hedberg 	if (event) {
1087b1abbbeSJohan Hedberg 		if (hdr->evt != event)
1097b1abbbeSJohan Hedberg 			goto failed;
1107b1abbbeSJohan Hedberg 		return skb;
1117b1abbbeSJohan Hedberg 	}
1127b1abbbeSJohan Hedberg 
11375e84b7cSJohan Hedberg 	if (hdr->evt != HCI_EV_CMD_COMPLETE) {
11475e84b7cSJohan Hedberg 		BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt);
11575e84b7cSJohan Hedberg 		goto failed;
11675e84b7cSJohan Hedberg 	}
11775e84b7cSJohan Hedberg 
11875e84b7cSJohan Hedberg 	if (skb->len < sizeof(*ev)) {
11975e84b7cSJohan Hedberg 		BT_ERR("Too short cmd_complete event");
12075e84b7cSJohan Hedberg 		goto failed;
12175e84b7cSJohan Hedberg 	}
12275e84b7cSJohan Hedberg 
12375e84b7cSJohan Hedberg 	ev = (void *) skb->data;
12475e84b7cSJohan Hedberg 	skb_pull(skb, sizeof(*ev));
12575e84b7cSJohan Hedberg 
12675e84b7cSJohan Hedberg 	if (opcode == __le16_to_cpu(ev->opcode))
12775e84b7cSJohan Hedberg 		return skb;
12875e84b7cSJohan Hedberg 
12975e84b7cSJohan Hedberg 	BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
13075e84b7cSJohan Hedberg 	       __le16_to_cpu(ev->opcode));
13175e84b7cSJohan Hedberg 
13275e84b7cSJohan Hedberg failed:
13375e84b7cSJohan Hedberg 	kfree_skb(skb);
13475e84b7cSJohan Hedberg 	return ERR_PTR(-ENODATA);
13575e84b7cSJohan Hedberg }
13675e84b7cSJohan Hedberg 
1377b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
13807dc93ddSJohan Hedberg 				  const void *param, u8 event, u32 timeout)
13975e84b7cSJohan Hedberg {
14075e84b7cSJohan Hedberg 	DECLARE_WAITQUEUE(wait, current);
14175e84b7cSJohan Hedberg 	struct hci_request req;
14275e84b7cSJohan Hedberg 	int err = 0;
14375e84b7cSJohan Hedberg 
14475e84b7cSJohan Hedberg 	BT_DBG("%s", hdev->name);
14575e84b7cSJohan Hedberg 
14675e84b7cSJohan Hedberg 	hci_req_init(&req, hdev);
14775e84b7cSJohan Hedberg 
1487b1abbbeSJohan Hedberg 	hci_req_add_ev(&req, opcode, plen, param, event);
14975e84b7cSJohan Hedberg 
15075e84b7cSJohan Hedberg 	hdev->req_status = HCI_REQ_PEND;
15175e84b7cSJohan Hedberg 
15275e84b7cSJohan Hedberg 	err = hci_req_run(&req, hci_req_sync_complete);
15375e84b7cSJohan Hedberg 	if (err < 0)
15475e84b7cSJohan Hedberg 		return ERR_PTR(err);
15575e84b7cSJohan Hedberg 
15675e84b7cSJohan Hedberg 	add_wait_queue(&hdev->req_wait_q, &wait);
15775e84b7cSJohan Hedberg 	set_current_state(TASK_INTERRUPTIBLE);
15875e84b7cSJohan Hedberg 
15975e84b7cSJohan Hedberg 	schedule_timeout(timeout);
16075e84b7cSJohan Hedberg 
16175e84b7cSJohan Hedberg 	remove_wait_queue(&hdev->req_wait_q, &wait);
16275e84b7cSJohan Hedberg 
16375e84b7cSJohan Hedberg 	if (signal_pending(current))
16475e84b7cSJohan Hedberg 		return ERR_PTR(-EINTR);
16575e84b7cSJohan Hedberg 
16675e84b7cSJohan Hedberg 	switch (hdev->req_status) {
16775e84b7cSJohan Hedberg 	case HCI_REQ_DONE:
16875e84b7cSJohan Hedberg 		err = -bt_to_errno(hdev->req_result);
16975e84b7cSJohan Hedberg 		break;
17075e84b7cSJohan Hedberg 
17175e84b7cSJohan Hedberg 	case HCI_REQ_CANCELED:
17275e84b7cSJohan Hedberg 		err = -hdev->req_result;
17375e84b7cSJohan Hedberg 		break;
17475e84b7cSJohan Hedberg 
17575e84b7cSJohan Hedberg 	default:
17675e84b7cSJohan Hedberg 		err = -ETIMEDOUT;
17775e84b7cSJohan Hedberg 		break;
17875e84b7cSJohan Hedberg 	}
17975e84b7cSJohan Hedberg 
18075e84b7cSJohan Hedberg 	hdev->req_status = hdev->req_result = 0;
18175e84b7cSJohan Hedberg 
18275e84b7cSJohan Hedberg 	BT_DBG("%s end: err %d", hdev->name, err);
18375e84b7cSJohan Hedberg 
18475e84b7cSJohan Hedberg 	if (err < 0)
18575e84b7cSJohan Hedberg 		return ERR_PTR(err);
18675e84b7cSJohan Hedberg 
1877b1abbbeSJohan Hedberg 	return hci_get_cmd_complete(hdev, opcode, event);
1887b1abbbeSJohan Hedberg }
1897b1abbbeSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync_ev);
1907b1abbbeSJohan Hedberg 
1917b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
19207dc93ddSJohan Hedberg 			       const void *param, u32 timeout)
1937b1abbbeSJohan Hedberg {
1947b1abbbeSJohan Hedberg 	return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout);
19575e84b7cSJohan Hedberg }
19675e84b7cSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync);
19775e84b7cSJohan Hedberg 
1981da177e4SLinus Torvalds /* Execute request and wait for completion. */
19901178cd4SJohan Hedberg static int __hci_req_sync(struct hci_dev *hdev,
20042c6b129SJohan Hedberg 			  void (*func)(struct hci_request *req,
20142c6b129SJohan Hedberg 				      unsigned long opt),
2021da177e4SLinus Torvalds 			  unsigned long opt, __u32 timeout)
2031da177e4SLinus Torvalds {
20442c6b129SJohan Hedberg 	struct hci_request req;
2051da177e4SLinus Torvalds 	DECLARE_WAITQUEUE(wait, current);
2061da177e4SLinus Torvalds 	int err = 0;
2071da177e4SLinus Torvalds 
2081da177e4SLinus Torvalds 	BT_DBG("%s start", hdev->name);
2091da177e4SLinus Torvalds 
21042c6b129SJohan Hedberg 	hci_req_init(&req, hdev);
21142c6b129SJohan Hedberg 
2121da177e4SLinus Torvalds 	hdev->req_status = HCI_REQ_PEND;
2131da177e4SLinus Torvalds 
21442c6b129SJohan Hedberg 	func(&req, opt);
21553cce22dSJohan Hedberg 
21642c6b129SJohan Hedberg 	err = hci_req_run(&req, hci_req_sync_complete);
21742c6b129SJohan Hedberg 	if (err < 0) {
21853cce22dSJohan Hedberg 		hdev->req_status = 0;
219920c8300SAndre Guedes 
220920c8300SAndre Guedes 		/* ENODATA means the HCI request command queue is empty.
221920c8300SAndre Guedes 		 * This can happen when a request with conditionals doesn't
222920c8300SAndre Guedes 		 * trigger any commands to be sent. This is normal behavior
223920c8300SAndre Guedes 		 * and should not trigger an error return.
22442c6b129SJohan Hedberg 		 */
225920c8300SAndre Guedes 		if (err == -ENODATA)
22642c6b129SJohan Hedberg 			return 0;
227920c8300SAndre Guedes 
228920c8300SAndre Guedes 		return err;
22953cce22dSJohan Hedberg 	}
23053cce22dSJohan Hedberg 
231bc4445c7SAndre Guedes 	add_wait_queue(&hdev->req_wait_q, &wait);
232bc4445c7SAndre Guedes 	set_current_state(TASK_INTERRUPTIBLE);
233bc4445c7SAndre Guedes 
2341da177e4SLinus Torvalds 	schedule_timeout(timeout);
2351da177e4SLinus Torvalds 
2361da177e4SLinus Torvalds 	remove_wait_queue(&hdev->req_wait_q, &wait);
2371da177e4SLinus Torvalds 
2381da177e4SLinus Torvalds 	if (signal_pending(current))
2391da177e4SLinus Torvalds 		return -EINTR;
2401da177e4SLinus Torvalds 
2411da177e4SLinus Torvalds 	switch (hdev->req_status) {
2421da177e4SLinus Torvalds 	case HCI_REQ_DONE:
243e175072fSJoe Perches 		err = -bt_to_errno(hdev->req_result);
2441da177e4SLinus Torvalds 		break;
2451da177e4SLinus Torvalds 
2461da177e4SLinus Torvalds 	case HCI_REQ_CANCELED:
2471da177e4SLinus Torvalds 		err = -hdev->req_result;
2481da177e4SLinus Torvalds 		break;
2491da177e4SLinus Torvalds 
2501da177e4SLinus Torvalds 	default:
2511da177e4SLinus Torvalds 		err = -ETIMEDOUT;
2521da177e4SLinus Torvalds 		break;
2533ff50b79SStephen Hemminger 	}
2541da177e4SLinus Torvalds 
255a5040efaSJohan Hedberg 	hdev->req_status = hdev->req_result = 0;
2561da177e4SLinus Torvalds 
2571da177e4SLinus Torvalds 	BT_DBG("%s end: err %d", hdev->name, err);
2581da177e4SLinus Torvalds 
2591da177e4SLinus Torvalds 	return err;
2601da177e4SLinus Torvalds }
2611da177e4SLinus Torvalds 
26201178cd4SJohan Hedberg static int hci_req_sync(struct hci_dev *hdev,
26342c6b129SJohan Hedberg 			void (*req)(struct hci_request *req,
26442c6b129SJohan Hedberg 				    unsigned long opt),
2651da177e4SLinus Torvalds 			unsigned long opt, __u32 timeout)
2661da177e4SLinus Torvalds {
2671da177e4SLinus Torvalds 	int ret;
2681da177e4SLinus Torvalds 
2697c6a329eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
2707c6a329eSMarcel Holtmann 		return -ENETDOWN;
2717c6a329eSMarcel Holtmann 
2721da177e4SLinus Torvalds 	/* Serialize all requests */
2731da177e4SLinus Torvalds 	hci_req_lock(hdev);
27401178cd4SJohan Hedberg 	ret = __hci_req_sync(hdev, req, opt, timeout);
2751da177e4SLinus Torvalds 	hci_req_unlock(hdev);
2761da177e4SLinus Torvalds 
2771da177e4SLinus Torvalds 	return ret;
2781da177e4SLinus Torvalds }
2791da177e4SLinus Torvalds 
28042c6b129SJohan Hedberg static void hci_reset_req(struct hci_request *req, unsigned long opt)
2811da177e4SLinus Torvalds {
28242c6b129SJohan Hedberg 	BT_DBG("%s %ld", req->hdev->name, opt);
2831da177e4SLinus Torvalds 
2841da177e4SLinus Torvalds 	/* Reset device */
28542c6b129SJohan Hedberg 	set_bit(HCI_RESET, &req->hdev->flags);
28642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_RESET, 0, NULL);
2871da177e4SLinus Torvalds }
2881da177e4SLinus Torvalds 
28942c6b129SJohan Hedberg static void bredr_init(struct hci_request *req)
2901da177e4SLinus Torvalds {
29142c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED;
2922455a3eaSAndrei Emeltchenko 
2931da177e4SLinus Torvalds 	/* Read Local Supported Features */
29442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
2951da177e4SLinus Torvalds 
2961143e5a6SMarcel Holtmann 	/* Read Local Version */
29742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
2982177bab5SJohan Hedberg 
2992177bab5SJohan Hedberg 	/* Read BD Address */
30042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
3011da177e4SLinus Torvalds }
3021da177e4SLinus Torvalds 
30342c6b129SJohan Hedberg static void amp_init(struct hci_request *req)
304e61ef499SAndrei Emeltchenko {
30542c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED;
3062455a3eaSAndrei Emeltchenko 
307e61ef499SAndrei Emeltchenko 	/* Read Local Version */
30842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
3096bcbc489SAndrei Emeltchenko 
3106bcbc489SAndrei Emeltchenko 	/* Read Local AMP Info */
31142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
312e71dfabaSAndrei Emeltchenko 
313e71dfabaSAndrei Emeltchenko 	/* Read Data Blk size */
31442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL);
315e61ef499SAndrei Emeltchenko }
316e61ef499SAndrei Emeltchenko 
31742c6b129SJohan Hedberg static void hci_init1_req(struct hci_request *req, unsigned long opt)
318e61ef499SAndrei Emeltchenko {
31942c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
320e61ef499SAndrei Emeltchenko 
321e61ef499SAndrei Emeltchenko 	BT_DBG("%s %ld", hdev->name, opt);
322e61ef499SAndrei Emeltchenko 
32311778716SAndrei Emeltchenko 	/* Reset */
32411778716SAndrei Emeltchenko 	if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
32542c6b129SJohan Hedberg 		hci_reset_req(req, 0);
32611778716SAndrei Emeltchenko 
327e61ef499SAndrei Emeltchenko 	switch (hdev->dev_type) {
328e61ef499SAndrei Emeltchenko 	case HCI_BREDR:
32942c6b129SJohan Hedberg 		bredr_init(req);
330e61ef499SAndrei Emeltchenko 		break;
331e61ef499SAndrei Emeltchenko 
332e61ef499SAndrei Emeltchenko 	case HCI_AMP:
33342c6b129SJohan Hedberg 		amp_init(req);
334e61ef499SAndrei Emeltchenko 		break;
335e61ef499SAndrei Emeltchenko 
336e61ef499SAndrei Emeltchenko 	default:
337e61ef499SAndrei Emeltchenko 		BT_ERR("Unknown device type %d", hdev->dev_type);
338e61ef499SAndrei Emeltchenko 		break;
339e61ef499SAndrei Emeltchenko 	}
340e61ef499SAndrei Emeltchenko }
341e61ef499SAndrei Emeltchenko 
34242c6b129SJohan Hedberg static void bredr_setup(struct hci_request *req)
3432177bab5SJohan Hedberg {
3442177bab5SJohan Hedberg 	__le16 param;
3452177bab5SJohan Hedberg 	__u8 flt_type;
3462177bab5SJohan Hedberg 
3472177bab5SJohan Hedberg 	/* Read Buffer Size (ACL mtu, max pkt, etc.) */
34842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL);
3492177bab5SJohan Hedberg 
3502177bab5SJohan Hedberg 	/* Read Class of Device */
35142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL);
3522177bab5SJohan Hedberg 
3532177bab5SJohan Hedberg 	/* Read Local Name */
35442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL);
3552177bab5SJohan Hedberg 
3562177bab5SJohan Hedberg 	/* Read Voice Setting */
35742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL);
3582177bab5SJohan Hedberg 
3592177bab5SJohan Hedberg 	/* Clear Event Filters */
3602177bab5SJohan Hedberg 	flt_type = HCI_FLT_CLEAR_ALL;
36142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type);
3622177bab5SJohan Hedberg 
3632177bab5SJohan Hedberg 	/* Connection accept timeout ~20 secs */
3642177bab5SJohan Hedberg 	param = __constant_cpu_to_le16(0x7d00);
36542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, &param);
3662177bab5SJohan Hedberg 
367f332ec66SJohan Hedberg 	/* Read page scan parameters */
368f332ec66SJohan Hedberg 	if (req->hdev->hci_ver > BLUETOOTH_VER_1_1) {
369f332ec66SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL);
370f332ec66SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL);
371f332ec66SJohan Hedberg 	}
3722177bab5SJohan Hedberg }
3732177bab5SJohan Hedberg 
37442c6b129SJohan Hedberg static void le_setup(struct hci_request *req)
3752177bab5SJohan Hedberg {
376c73eee91SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
377c73eee91SJohan Hedberg 
3782177bab5SJohan Hedberg 	/* Read LE Buffer Size */
37942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
3802177bab5SJohan Hedberg 
3812177bab5SJohan Hedberg 	/* Read LE Local Supported Features */
38242c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL);
3832177bab5SJohan Hedberg 
3842177bab5SJohan Hedberg 	/* Read LE Advertising Channel TX Power */
38542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL);
3862177bab5SJohan Hedberg 
3872177bab5SJohan Hedberg 	/* Read LE White List Size */
38842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL);
3892177bab5SJohan Hedberg 
3902177bab5SJohan Hedberg 	/* Read LE Supported States */
39142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL);
392c73eee91SJohan Hedberg 
393c73eee91SJohan Hedberg 	/* LE-only controllers have LE implicitly enabled */
394c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
395c73eee91SJohan Hedberg 		set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
3962177bab5SJohan Hedberg }
3972177bab5SJohan Hedberg 
3982177bab5SJohan Hedberg static u8 hci_get_inquiry_mode(struct hci_dev *hdev)
3992177bab5SJohan Hedberg {
4002177bab5SJohan Hedberg 	if (lmp_ext_inq_capable(hdev))
4012177bab5SJohan Hedberg 		return 0x02;
4022177bab5SJohan Hedberg 
4032177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
4042177bab5SJohan Hedberg 		return 0x01;
4052177bab5SJohan Hedberg 
4062177bab5SJohan Hedberg 	if (hdev->manufacturer == 11 && hdev->hci_rev == 0x00 &&
4072177bab5SJohan Hedberg 	    hdev->lmp_subver == 0x0757)
4082177bab5SJohan Hedberg 		return 0x01;
4092177bab5SJohan Hedberg 
4102177bab5SJohan Hedberg 	if (hdev->manufacturer == 15) {
4112177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x03 && hdev->lmp_subver == 0x6963)
4122177bab5SJohan Hedberg 			return 0x01;
4132177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x09 && hdev->lmp_subver == 0x6963)
4142177bab5SJohan Hedberg 			return 0x01;
4152177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x00 && hdev->lmp_subver == 0x6965)
4162177bab5SJohan Hedberg 			return 0x01;
4172177bab5SJohan Hedberg 	}
4182177bab5SJohan Hedberg 
4192177bab5SJohan Hedberg 	if (hdev->manufacturer == 31 && hdev->hci_rev == 0x2005 &&
4202177bab5SJohan Hedberg 	    hdev->lmp_subver == 0x1805)
4212177bab5SJohan Hedberg 		return 0x01;
4222177bab5SJohan Hedberg 
4232177bab5SJohan Hedberg 	return 0x00;
4242177bab5SJohan Hedberg }
4252177bab5SJohan Hedberg 
42642c6b129SJohan Hedberg static void hci_setup_inquiry_mode(struct hci_request *req)
4272177bab5SJohan Hedberg {
4282177bab5SJohan Hedberg 	u8 mode;
4292177bab5SJohan Hedberg 
43042c6b129SJohan Hedberg 	mode = hci_get_inquiry_mode(req->hdev);
4312177bab5SJohan Hedberg 
43242c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode);
4332177bab5SJohan Hedberg }
4342177bab5SJohan Hedberg 
43542c6b129SJohan Hedberg static void hci_setup_event_mask(struct hci_request *req)
4362177bab5SJohan Hedberg {
43742c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
43842c6b129SJohan Hedberg 
4392177bab5SJohan Hedberg 	/* The second byte is 0xff instead of 0x9f (two reserved bits
4402177bab5SJohan Hedberg 	 * disabled) since a Broadcom 1.2 dongle doesn't respond to the
4412177bab5SJohan Hedberg 	 * command otherwise.
4422177bab5SJohan Hedberg 	 */
4432177bab5SJohan Hedberg 	u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 };
4442177bab5SJohan Hedberg 
4452177bab5SJohan Hedberg 	/* CSR 1.1 dongles does not accept any bitfield so don't try to set
4462177bab5SJohan Hedberg 	 * any event mask for pre 1.2 devices.
4472177bab5SJohan Hedberg 	 */
4482177bab5SJohan Hedberg 	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
4492177bab5SJohan Hedberg 		return;
4502177bab5SJohan Hedberg 
4512177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
4522177bab5SJohan Hedberg 		events[4] |= 0x01; /* Flow Specification Complete */
4532177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
4542177bab5SJohan Hedberg 		events[4] |= 0x04; /* Read Remote Extended Features Complete */
4552177bab5SJohan Hedberg 		events[5] |= 0x08; /* Synchronous Connection Complete */
4562177bab5SJohan Hedberg 		events[5] |= 0x10; /* Synchronous Connection Changed */
457c7882cbdSMarcel Holtmann 	} else {
458c7882cbdSMarcel Holtmann 		/* Use a different default for LE-only devices */
459c7882cbdSMarcel Holtmann 		memset(events, 0, sizeof(events));
460c7882cbdSMarcel Holtmann 		events[0] |= 0x10; /* Disconnection Complete */
461c7882cbdSMarcel Holtmann 		events[0] |= 0x80; /* Encryption Change */
462c7882cbdSMarcel Holtmann 		events[1] |= 0x08; /* Read Remote Version Information Complete */
463c7882cbdSMarcel Holtmann 		events[1] |= 0x20; /* Command Complete */
464c7882cbdSMarcel Holtmann 		events[1] |= 0x40; /* Command Status */
465c7882cbdSMarcel Holtmann 		events[1] |= 0x80; /* Hardware Error */
466c7882cbdSMarcel Holtmann 		events[2] |= 0x04; /* Number of Completed Packets */
467c7882cbdSMarcel Holtmann 		events[3] |= 0x02; /* Data Buffer Overflow */
468c7882cbdSMarcel Holtmann 		events[5] |= 0x80; /* Encryption Key Refresh Complete */
4692177bab5SJohan Hedberg 	}
4702177bab5SJohan Hedberg 
4712177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
4722177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
4732177bab5SJohan Hedberg 
4742177bab5SJohan Hedberg 	if (lmp_sniffsubr_capable(hdev))
4752177bab5SJohan Hedberg 		events[5] |= 0x20; /* Sniff Subrating */
4762177bab5SJohan Hedberg 
4772177bab5SJohan Hedberg 	if (lmp_pause_enc_capable(hdev))
4782177bab5SJohan Hedberg 		events[5] |= 0x80; /* Encryption Key Refresh Complete */
4792177bab5SJohan Hedberg 
4802177bab5SJohan Hedberg 	if (lmp_ext_inq_capable(hdev))
4812177bab5SJohan Hedberg 		events[5] |= 0x40; /* Extended Inquiry Result */
4822177bab5SJohan Hedberg 
4832177bab5SJohan Hedberg 	if (lmp_no_flush_capable(hdev))
4842177bab5SJohan Hedberg 		events[7] |= 0x01; /* Enhanced Flush Complete */
4852177bab5SJohan Hedberg 
4862177bab5SJohan Hedberg 	if (lmp_lsto_capable(hdev))
4872177bab5SJohan Hedberg 		events[6] |= 0x80; /* Link Supervision Timeout Changed */
4882177bab5SJohan Hedberg 
4892177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
4902177bab5SJohan Hedberg 		events[6] |= 0x01;	/* IO Capability Request */
4912177bab5SJohan Hedberg 		events[6] |= 0x02;	/* IO Capability Response */
4922177bab5SJohan Hedberg 		events[6] |= 0x04;	/* User Confirmation Request */
4932177bab5SJohan Hedberg 		events[6] |= 0x08;	/* User Passkey Request */
4942177bab5SJohan Hedberg 		events[6] |= 0x10;	/* Remote OOB Data Request */
4952177bab5SJohan Hedberg 		events[6] |= 0x20;	/* Simple Pairing Complete */
4962177bab5SJohan Hedberg 		events[7] |= 0x04;	/* User Passkey Notification */
4972177bab5SJohan Hedberg 		events[7] |= 0x08;	/* Keypress Notification */
4982177bab5SJohan Hedberg 		events[7] |= 0x10;	/* Remote Host Supported
4992177bab5SJohan Hedberg 					 * Features Notification
5002177bab5SJohan Hedberg 					 */
5012177bab5SJohan Hedberg 	}
5022177bab5SJohan Hedberg 
5032177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
5042177bab5SJohan Hedberg 		events[7] |= 0x20;	/* LE Meta-Event */
5052177bab5SJohan Hedberg 
50642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events);
5072177bab5SJohan Hedberg 
5082177bab5SJohan Hedberg 	if (lmp_le_capable(hdev)) {
5092177bab5SJohan Hedberg 		memset(events, 0, sizeof(events));
5102177bab5SJohan Hedberg 		events[0] = 0x1f;
51142c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK,
5122177bab5SJohan Hedberg 			    sizeof(events), events);
5132177bab5SJohan Hedberg 	}
5142177bab5SJohan Hedberg }
5152177bab5SJohan Hedberg 
51642c6b129SJohan Hedberg static void hci_init2_req(struct hci_request *req, unsigned long opt)
5172177bab5SJohan Hedberg {
51842c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
51942c6b129SJohan Hedberg 
5202177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev))
52142c6b129SJohan Hedberg 		bredr_setup(req);
5222177bab5SJohan Hedberg 
5232177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
52442c6b129SJohan Hedberg 		le_setup(req);
5252177bab5SJohan Hedberg 
52642c6b129SJohan Hedberg 	hci_setup_event_mask(req);
5272177bab5SJohan Hedberg 
5283f8e2d75SJohan Hedberg 	/* AVM Berlin (31), aka "BlueFRITZ!", doesn't support the read
5293f8e2d75SJohan Hedberg 	 * local supported commands HCI command.
5303f8e2d75SJohan Hedberg 	 */
5313f8e2d75SJohan Hedberg 	if (hdev->manufacturer != 31 && hdev->hci_ver > BLUETOOTH_VER_1_1)
53242c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
5332177bab5SJohan Hedberg 
5342177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
5352177bab5SJohan Hedberg 		if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
5362177bab5SJohan Hedberg 			u8 mode = 0x01;
53742c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_SSP_MODE,
5382177bab5SJohan Hedberg 				    sizeof(mode), &mode);
5392177bab5SJohan Hedberg 		} else {
5402177bab5SJohan Hedberg 			struct hci_cp_write_eir cp;
5412177bab5SJohan Hedberg 
5422177bab5SJohan Hedberg 			memset(hdev->eir, 0, sizeof(hdev->eir));
5432177bab5SJohan Hedberg 			memset(&cp, 0, sizeof(cp));
5442177bab5SJohan Hedberg 
54542c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
5462177bab5SJohan Hedberg 		}
5472177bab5SJohan Hedberg 	}
5482177bab5SJohan Hedberg 
5492177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
55042c6b129SJohan Hedberg 		hci_setup_inquiry_mode(req);
5512177bab5SJohan Hedberg 
5522177bab5SJohan Hedberg 	if (lmp_inq_tx_pwr_capable(hdev))
55342c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL);
5542177bab5SJohan Hedberg 
5552177bab5SJohan Hedberg 	if (lmp_ext_feat_capable(hdev)) {
5562177bab5SJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
5572177bab5SJohan Hedberg 
5582177bab5SJohan Hedberg 		cp.page = 0x01;
55942c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
56042c6b129SJohan Hedberg 			    sizeof(cp), &cp);
5612177bab5SJohan Hedberg 	}
5622177bab5SJohan Hedberg 
5632177bab5SJohan Hedberg 	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags)) {
5642177bab5SJohan Hedberg 		u8 enable = 1;
56542c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable),
5662177bab5SJohan Hedberg 			    &enable);
5672177bab5SJohan Hedberg 	}
5682177bab5SJohan Hedberg }
5692177bab5SJohan Hedberg 
57042c6b129SJohan Hedberg static void hci_setup_link_policy(struct hci_request *req)
5712177bab5SJohan Hedberg {
57242c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
5732177bab5SJohan Hedberg 	struct hci_cp_write_def_link_policy cp;
5742177bab5SJohan Hedberg 	u16 link_policy = 0;
5752177bab5SJohan Hedberg 
5762177bab5SJohan Hedberg 	if (lmp_rswitch_capable(hdev))
5772177bab5SJohan Hedberg 		link_policy |= HCI_LP_RSWITCH;
5782177bab5SJohan Hedberg 	if (lmp_hold_capable(hdev))
5792177bab5SJohan Hedberg 		link_policy |= HCI_LP_HOLD;
5802177bab5SJohan Hedberg 	if (lmp_sniff_capable(hdev))
5812177bab5SJohan Hedberg 		link_policy |= HCI_LP_SNIFF;
5822177bab5SJohan Hedberg 	if (lmp_park_capable(hdev))
5832177bab5SJohan Hedberg 		link_policy |= HCI_LP_PARK;
5842177bab5SJohan Hedberg 
5852177bab5SJohan Hedberg 	cp.policy = cpu_to_le16(link_policy);
58642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp);
5872177bab5SJohan Hedberg }
5882177bab5SJohan Hedberg 
58942c6b129SJohan Hedberg static void hci_set_le_support(struct hci_request *req)
5902177bab5SJohan Hedberg {
59142c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
5922177bab5SJohan Hedberg 	struct hci_cp_write_le_host_supported cp;
5932177bab5SJohan Hedberg 
594c73eee91SJohan Hedberg 	/* LE-only devices do not support explicit enablement */
595c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
596c73eee91SJohan Hedberg 		return;
597c73eee91SJohan Hedberg 
5982177bab5SJohan Hedberg 	memset(&cp, 0, sizeof(cp));
5992177bab5SJohan Hedberg 
6002177bab5SJohan Hedberg 	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
6012177bab5SJohan Hedberg 		cp.le = 0x01;
6022177bab5SJohan Hedberg 		cp.simul = lmp_le_br_capable(hdev);
6032177bab5SJohan Hedberg 	}
6042177bab5SJohan Hedberg 
6052177bab5SJohan Hedberg 	if (cp.le != lmp_host_le_capable(hdev))
60642c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp),
6072177bab5SJohan Hedberg 			    &cp);
6082177bab5SJohan Hedberg }
6092177bab5SJohan Hedberg 
61042c6b129SJohan Hedberg static void hci_init3_req(struct hci_request *req, unsigned long opt)
6112177bab5SJohan Hedberg {
61242c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
613d2c5d77fSJohan Hedberg 	u8 p;
61442c6b129SJohan Hedberg 
615b8f4e068SGustavo Padovan 	/* Some Broadcom based Bluetooth controllers do not support the
616b8f4e068SGustavo Padovan 	 * Delete Stored Link Key command. They are clearly indicating its
617b8f4e068SGustavo Padovan 	 * absence in the bit mask of supported commands.
618b8f4e068SGustavo Padovan 	 *
619b8f4e068SGustavo Padovan 	 * Check the supported commands and only if the the command is marked
620b8f4e068SGustavo Padovan 	 * as supported send it. If not supported assume that the controller
621b8f4e068SGustavo Padovan 	 * does not have actual support for stored link keys which makes this
622b8f4e068SGustavo Padovan 	 * command redundant anyway.
623b8f4e068SGustavo Padovan 	 */
62459f45d57SJohan Hedberg 	if (hdev->commands[6] & 0x80) {
62559f45d57SJohan Hedberg 		struct hci_cp_delete_stored_link_key cp;
62659f45d57SJohan Hedberg 
62759f45d57SJohan Hedberg 		bacpy(&cp.bdaddr, BDADDR_ANY);
62859f45d57SJohan Hedberg 		cp.delete_all = 0x01;
62959f45d57SJohan Hedberg 		hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY,
63059f45d57SJohan Hedberg 			    sizeof(cp), &cp);
63159f45d57SJohan Hedberg 	}
63259f45d57SJohan Hedberg 
6332177bab5SJohan Hedberg 	if (hdev->commands[5] & 0x10)
63442c6b129SJohan Hedberg 		hci_setup_link_policy(req);
6352177bab5SJohan Hedberg 
63604b4edcbSJohan Hedberg 	if (lmp_le_capable(hdev)) {
63742c6b129SJohan Hedberg 		hci_set_le_support(req);
63804b4edcbSJohan Hedberg 		hci_update_ad(req);
63904b4edcbSJohan Hedberg 	}
640d2c5d77fSJohan Hedberg 
641d2c5d77fSJohan Hedberg 	/* Read features beyond page 1 if available */
642d2c5d77fSJohan Hedberg 	for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
643d2c5d77fSJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
644d2c5d77fSJohan Hedberg 
645d2c5d77fSJohan Hedberg 		cp.page = p;
646d2c5d77fSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
647d2c5d77fSJohan Hedberg 			    sizeof(cp), &cp);
648d2c5d77fSJohan Hedberg 	}
6492177bab5SJohan Hedberg }
6502177bab5SJohan Hedberg 
651*5d4e7e8dSJohan Hedberg static void hci_init4_req(struct hci_request *req, unsigned long opt)
652*5d4e7e8dSJohan Hedberg {
653*5d4e7e8dSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
654*5d4e7e8dSJohan Hedberg 
655*5d4e7e8dSJohan Hedberg 	/* Check for Synchronization Train support */
656*5d4e7e8dSJohan Hedberg 	if (hdev->features[2][0] & 0x04)
657*5d4e7e8dSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL);
658*5d4e7e8dSJohan Hedberg }
659*5d4e7e8dSJohan Hedberg 
6602177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev)
6612177bab5SJohan Hedberg {
6622177bab5SJohan Hedberg 	int err;
6632177bab5SJohan Hedberg 
6642177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT);
6652177bab5SJohan Hedberg 	if (err < 0)
6662177bab5SJohan Hedberg 		return err;
6672177bab5SJohan Hedberg 
6682177bab5SJohan Hedberg 	/* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode
6692177bab5SJohan Hedberg 	 * BR/EDR/LE type controllers. AMP controllers only need the
6702177bab5SJohan Hedberg 	 * first stage init.
6712177bab5SJohan Hedberg 	 */
6722177bab5SJohan Hedberg 	if (hdev->dev_type != HCI_BREDR)
6732177bab5SJohan Hedberg 		return 0;
6742177bab5SJohan Hedberg 
6752177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT);
6762177bab5SJohan Hedberg 	if (err < 0)
6772177bab5SJohan Hedberg 		return err;
6782177bab5SJohan Hedberg 
679*5d4e7e8dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT);
680*5d4e7e8dSJohan Hedberg 	if (err < 0)
681*5d4e7e8dSJohan Hedberg 		return err;
682*5d4e7e8dSJohan Hedberg 
683*5d4e7e8dSJohan Hedberg 	return __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT);
6842177bab5SJohan Hedberg }
6852177bab5SJohan Hedberg 
68642c6b129SJohan Hedberg static void hci_scan_req(struct hci_request *req, unsigned long opt)
6871da177e4SLinus Torvalds {
6881da177e4SLinus Torvalds 	__u8 scan = opt;
6891da177e4SLinus Torvalds 
69042c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, scan);
6911da177e4SLinus Torvalds 
6921da177e4SLinus Torvalds 	/* Inquiry and Page scans */
69342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
6941da177e4SLinus Torvalds }
6951da177e4SLinus Torvalds 
69642c6b129SJohan Hedberg static void hci_auth_req(struct hci_request *req, unsigned long opt)
6971da177e4SLinus Torvalds {
6981da177e4SLinus Torvalds 	__u8 auth = opt;
6991da177e4SLinus Torvalds 
70042c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, auth);
7011da177e4SLinus Torvalds 
7021da177e4SLinus Torvalds 	/* Authentication */
70342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
7041da177e4SLinus Torvalds }
7051da177e4SLinus Torvalds 
70642c6b129SJohan Hedberg static void hci_encrypt_req(struct hci_request *req, unsigned long opt)
7071da177e4SLinus Torvalds {
7081da177e4SLinus Torvalds 	__u8 encrypt = opt;
7091da177e4SLinus Torvalds 
71042c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, encrypt);
7111da177e4SLinus Torvalds 
712e4e8e37cSMarcel Holtmann 	/* Encryption */
71342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
7141da177e4SLinus Torvalds }
7151da177e4SLinus Torvalds 
71642c6b129SJohan Hedberg static void hci_linkpol_req(struct hci_request *req, unsigned long opt)
717e4e8e37cSMarcel Holtmann {
718e4e8e37cSMarcel Holtmann 	__le16 policy = cpu_to_le16(opt);
719e4e8e37cSMarcel Holtmann 
72042c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, policy);
721e4e8e37cSMarcel Holtmann 
722e4e8e37cSMarcel Holtmann 	/* Default link policy */
72342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
724e4e8e37cSMarcel Holtmann }
725e4e8e37cSMarcel Holtmann 
7261da177e4SLinus Torvalds /* Get HCI device by index.
7271da177e4SLinus Torvalds  * Device is held on return. */
7281da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index)
7291da177e4SLinus Torvalds {
7308035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev = NULL, *d;
7311da177e4SLinus Torvalds 
7321da177e4SLinus Torvalds 	BT_DBG("%d", index);
7331da177e4SLinus Torvalds 
7341da177e4SLinus Torvalds 	if (index < 0)
7351da177e4SLinus Torvalds 		return NULL;
7361da177e4SLinus Torvalds 
7371da177e4SLinus Torvalds 	read_lock(&hci_dev_list_lock);
7388035ded4SLuiz Augusto von Dentz 	list_for_each_entry(d, &hci_dev_list, list) {
7391da177e4SLinus Torvalds 		if (d->id == index) {
7401da177e4SLinus Torvalds 			hdev = hci_dev_hold(d);
7411da177e4SLinus Torvalds 			break;
7421da177e4SLinus Torvalds 		}
7431da177e4SLinus Torvalds 	}
7441da177e4SLinus Torvalds 	read_unlock(&hci_dev_list_lock);
7451da177e4SLinus Torvalds 	return hdev;
7461da177e4SLinus Torvalds }
7471da177e4SLinus Torvalds 
7481da177e4SLinus Torvalds /* ---- Inquiry support ---- */
749ff9ef578SJohan Hedberg 
75030dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev)
75130dc78e1SJohan Hedberg {
75230dc78e1SJohan Hedberg 	struct discovery_state *discov = &hdev->discovery;
75330dc78e1SJohan Hedberg 
7546fbe195dSAndre Guedes 	switch (discov->state) {
755343f935bSAndre Guedes 	case DISCOVERY_FINDING:
7566fbe195dSAndre Guedes 	case DISCOVERY_RESOLVING:
75730dc78e1SJohan Hedberg 		return true;
75830dc78e1SJohan Hedberg 
7596fbe195dSAndre Guedes 	default:
76030dc78e1SJohan Hedberg 		return false;
76130dc78e1SJohan Hedberg 	}
7626fbe195dSAndre Guedes }
76330dc78e1SJohan Hedberg 
764ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state)
765ff9ef578SJohan Hedberg {
766ff9ef578SJohan Hedberg 	BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state);
767ff9ef578SJohan Hedberg 
768ff9ef578SJohan Hedberg 	if (hdev->discovery.state == state)
769ff9ef578SJohan Hedberg 		return;
770ff9ef578SJohan Hedberg 
771ff9ef578SJohan Hedberg 	switch (state) {
772ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPED:
7737b99b659SAndre Guedes 		if (hdev->discovery.state != DISCOVERY_STARTING)
774ff9ef578SJohan Hedberg 			mgmt_discovering(hdev, 0);
775ff9ef578SJohan Hedberg 		break;
776ff9ef578SJohan Hedberg 	case DISCOVERY_STARTING:
777ff9ef578SJohan Hedberg 		break;
778343f935bSAndre Guedes 	case DISCOVERY_FINDING:
779ff9ef578SJohan Hedberg 		mgmt_discovering(hdev, 1);
780ff9ef578SJohan Hedberg 		break;
78130dc78e1SJohan Hedberg 	case DISCOVERY_RESOLVING:
78230dc78e1SJohan Hedberg 		break;
783ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPING:
784ff9ef578SJohan Hedberg 		break;
785ff9ef578SJohan Hedberg 	}
786ff9ef578SJohan Hedberg 
787ff9ef578SJohan Hedberg 	hdev->discovery.state = state;
788ff9ef578SJohan Hedberg }
789ff9ef578SJohan Hedberg 
7901f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev)
7911da177e4SLinus Torvalds {
79230883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
793b57c1a56SJohan Hedberg 	struct inquiry_entry *p, *n;
7941da177e4SLinus Torvalds 
795561aafbcSJohan Hedberg 	list_for_each_entry_safe(p, n, &cache->all, all) {
796561aafbcSJohan Hedberg 		list_del(&p->all);
797b57c1a56SJohan Hedberg 		kfree(p);
7981da177e4SLinus Torvalds 	}
799561aafbcSJohan Hedberg 
800561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->unknown);
801561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->resolve);
8021da177e4SLinus Torvalds }
8031da177e4SLinus Torvalds 
804a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
805a8c5fb1aSGustavo Padovan 					       bdaddr_t *bdaddr)
8061da177e4SLinus Torvalds {
80730883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
8081da177e4SLinus Torvalds 	struct inquiry_entry *e;
8091da177e4SLinus Torvalds 
8106ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
8111da177e4SLinus Torvalds 
812561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
8131da177e4SLinus Torvalds 		if (!bacmp(&e->data.bdaddr, bdaddr))
8141da177e4SLinus Torvalds 			return e;
8151da177e4SLinus Torvalds 	}
8161da177e4SLinus Torvalds 
817b57c1a56SJohan Hedberg 	return NULL;
818b57c1a56SJohan Hedberg }
819b57c1a56SJohan Hedberg 
820561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
821561aafbcSJohan Hedberg 						       bdaddr_t *bdaddr)
822561aafbcSJohan Hedberg {
82330883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
824561aafbcSJohan Hedberg 	struct inquiry_entry *e;
825561aafbcSJohan Hedberg 
8266ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
827561aafbcSJohan Hedberg 
828561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->unknown, list) {
829561aafbcSJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
830561aafbcSJohan Hedberg 			return e;
831561aafbcSJohan Hedberg 	}
832561aafbcSJohan Hedberg 
833561aafbcSJohan Hedberg 	return NULL;
834561aafbcSJohan Hedberg }
835561aafbcSJohan Hedberg 
83630dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
83730dc78e1SJohan Hedberg 						       bdaddr_t *bdaddr,
83830dc78e1SJohan Hedberg 						       int state)
83930dc78e1SJohan Hedberg {
84030dc78e1SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
84130dc78e1SJohan Hedberg 	struct inquiry_entry *e;
84230dc78e1SJohan Hedberg 
8436ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state);
84430dc78e1SJohan Hedberg 
84530dc78e1SJohan Hedberg 	list_for_each_entry(e, &cache->resolve, list) {
84630dc78e1SJohan Hedberg 		if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state)
84730dc78e1SJohan Hedberg 			return e;
84830dc78e1SJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
84930dc78e1SJohan Hedberg 			return e;
85030dc78e1SJohan Hedberg 	}
85130dc78e1SJohan Hedberg 
85230dc78e1SJohan Hedberg 	return NULL;
85330dc78e1SJohan Hedberg }
85430dc78e1SJohan Hedberg 
855a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
856a3d4e20aSJohan Hedberg 				      struct inquiry_entry *ie)
857a3d4e20aSJohan Hedberg {
858a3d4e20aSJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
859a3d4e20aSJohan Hedberg 	struct list_head *pos = &cache->resolve;
860a3d4e20aSJohan Hedberg 	struct inquiry_entry *p;
861a3d4e20aSJohan Hedberg 
862a3d4e20aSJohan Hedberg 	list_del(&ie->list);
863a3d4e20aSJohan Hedberg 
864a3d4e20aSJohan Hedberg 	list_for_each_entry(p, &cache->resolve, list) {
865a3d4e20aSJohan Hedberg 		if (p->name_state != NAME_PENDING &&
866a3d4e20aSJohan Hedberg 		    abs(p->data.rssi) >= abs(ie->data.rssi))
867a3d4e20aSJohan Hedberg 			break;
868a3d4e20aSJohan Hedberg 		pos = &p->list;
869a3d4e20aSJohan Hedberg 	}
870a3d4e20aSJohan Hedberg 
871a3d4e20aSJohan Hedberg 	list_add(&ie->list, pos);
872a3d4e20aSJohan Hedberg }
873a3d4e20aSJohan Hedberg 
8743175405bSJohan Hedberg bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
875388fc8faSJohan Hedberg 			      bool name_known, bool *ssp)
8761da177e4SLinus Torvalds {
87730883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
87870f23020SAndrei Emeltchenko 	struct inquiry_entry *ie;
8791da177e4SLinus Torvalds 
8806ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, &data->bdaddr);
8811da177e4SLinus Torvalds 
8822b2fec4dSSzymon Janc 	hci_remove_remote_oob_data(hdev, &data->bdaddr);
8832b2fec4dSSzymon Janc 
884388fc8faSJohan Hedberg 	if (ssp)
885388fc8faSJohan Hedberg 		*ssp = data->ssp_mode;
886388fc8faSJohan Hedberg 
88770f23020SAndrei Emeltchenko 	ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr);
888a3d4e20aSJohan Hedberg 	if (ie) {
889388fc8faSJohan Hedberg 		if (ie->data.ssp_mode && ssp)
890388fc8faSJohan Hedberg 			*ssp = true;
891388fc8faSJohan Hedberg 
892a3d4e20aSJohan Hedberg 		if (ie->name_state == NAME_NEEDED &&
893a3d4e20aSJohan Hedberg 		    data->rssi != ie->data.rssi) {
894a3d4e20aSJohan Hedberg 			ie->data.rssi = data->rssi;
895a3d4e20aSJohan Hedberg 			hci_inquiry_cache_update_resolve(hdev, ie);
896a3d4e20aSJohan Hedberg 		}
897a3d4e20aSJohan Hedberg 
898561aafbcSJohan Hedberg 		goto update;
899a3d4e20aSJohan Hedberg 	}
900561aafbcSJohan Hedberg 
9011da177e4SLinus Torvalds 	/* Entry not in the cache. Add new one. */
90270f23020SAndrei Emeltchenko 	ie = kzalloc(sizeof(struct inquiry_entry), GFP_ATOMIC);
90370f23020SAndrei Emeltchenko 	if (!ie)
9043175405bSJohan Hedberg 		return false;
90570f23020SAndrei Emeltchenko 
906561aafbcSJohan Hedberg 	list_add(&ie->all, &cache->all);
907561aafbcSJohan Hedberg 
908561aafbcSJohan Hedberg 	if (name_known) {
909561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
910561aafbcSJohan Hedberg 	} else {
911561aafbcSJohan Hedberg 		ie->name_state = NAME_NOT_KNOWN;
912561aafbcSJohan Hedberg 		list_add(&ie->list, &cache->unknown);
913561aafbcSJohan Hedberg 	}
914561aafbcSJohan Hedberg 
915561aafbcSJohan Hedberg update:
916561aafbcSJohan Hedberg 	if (name_known && ie->name_state != NAME_KNOWN &&
917561aafbcSJohan Hedberg 	    ie->name_state != NAME_PENDING) {
918561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
919561aafbcSJohan Hedberg 		list_del(&ie->list);
9201da177e4SLinus Torvalds 	}
9211da177e4SLinus Torvalds 
92270f23020SAndrei Emeltchenko 	memcpy(&ie->data, data, sizeof(*data));
92370f23020SAndrei Emeltchenko 	ie->timestamp = jiffies;
9241da177e4SLinus Torvalds 	cache->timestamp = jiffies;
9253175405bSJohan Hedberg 
9263175405bSJohan Hedberg 	if (ie->name_state == NAME_NOT_KNOWN)
9273175405bSJohan Hedberg 		return false;
9283175405bSJohan Hedberg 
9293175405bSJohan Hedberg 	return true;
9301da177e4SLinus Torvalds }
9311da177e4SLinus Torvalds 
9321da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf)
9331da177e4SLinus Torvalds {
93430883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
9351da177e4SLinus Torvalds 	struct inquiry_info *info = (struct inquiry_info *) buf;
9361da177e4SLinus Torvalds 	struct inquiry_entry *e;
9371da177e4SLinus Torvalds 	int copied = 0;
9381da177e4SLinus Torvalds 
939561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
9401da177e4SLinus Torvalds 		struct inquiry_data *data = &e->data;
941b57c1a56SJohan Hedberg 
942b57c1a56SJohan Hedberg 		if (copied >= num)
943b57c1a56SJohan Hedberg 			break;
944b57c1a56SJohan Hedberg 
9451da177e4SLinus Torvalds 		bacpy(&info->bdaddr, &data->bdaddr);
9461da177e4SLinus Torvalds 		info->pscan_rep_mode	= data->pscan_rep_mode;
9471da177e4SLinus Torvalds 		info->pscan_period_mode	= data->pscan_period_mode;
9481da177e4SLinus Torvalds 		info->pscan_mode	= data->pscan_mode;
9491da177e4SLinus Torvalds 		memcpy(info->dev_class, data->dev_class, 3);
9501da177e4SLinus Torvalds 		info->clock_offset	= data->clock_offset;
951b57c1a56SJohan Hedberg 
9521da177e4SLinus Torvalds 		info++;
953b57c1a56SJohan Hedberg 		copied++;
9541da177e4SLinus Torvalds 	}
9551da177e4SLinus Torvalds 
9561da177e4SLinus Torvalds 	BT_DBG("cache %p, copied %d", cache, copied);
9571da177e4SLinus Torvalds 	return copied;
9581da177e4SLinus Torvalds }
9591da177e4SLinus Torvalds 
96042c6b129SJohan Hedberg static void hci_inq_req(struct hci_request *req, unsigned long opt)
9611da177e4SLinus Torvalds {
9621da177e4SLinus Torvalds 	struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt;
96342c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
9641da177e4SLinus Torvalds 	struct hci_cp_inquiry cp;
9651da177e4SLinus Torvalds 
9661da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
9671da177e4SLinus Torvalds 
9681da177e4SLinus Torvalds 	if (test_bit(HCI_INQUIRY, &hdev->flags))
9691da177e4SLinus Torvalds 		return;
9701da177e4SLinus Torvalds 
9711da177e4SLinus Torvalds 	/* Start Inquiry */
9721da177e4SLinus Torvalds 	memcpy(&cp.lap, &ir->lap, 3);
9731da177e4SLinus Torvalds 	cp.length  = ir->length;
9741da177e4SLinus Torvalds 	cp.num_rsp = ir->num_rsp;
97542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);
9761da177e4SLinus Torvalds }
9771da177e4SLinus Torvalds 
9783e13fa1eSAndre Guedes static int wait_inquiry(void *word)
9793e13fa1eSAndre Guedes {
9803e13fa1eSAndre Guedes 	schedule();
9813e13fa1eSAndre Guedes 	return signal_pending(current);
9823e13fa1eSAndre Guedes }
9833e13fa1eSAndre Guedes 
9841da177e4SLinus Torvalds int hci_inquiry(void __user *arg)
9851da177e4SLinus Torvalds {
9861da177e4SLinus Torvalds 	__u8 __user *ptr = arg;
9871da177e4SLinus Torvalds 	struct hci_inquiry_req ir;
9881da177e4SLinus Torvalds 	struct hci_dev *hdev;
9891da177e4SLinus Torvalds 	int err = 0, do_inquiry = 0, max_rsp;
9901da177e4SLinus Torvalds 	long timeo;
9911da177e4SLinus Torvalds 	__u8 *buf;
9921da177e4SLinus Torvalds 
9931da177e4SLinus Torvalds 	if (copy_from_user(&ir, ptr, sizeof(ir)))
9941da177e4SLinus Torvalds 		return -EFAULT;
9951da177e4SLinus Torvalds 
9965a08ecceSAndrei Emeltchenko 	hdev = hci_dev_get(ir.dev_id);
9975a08ecceSAndrei Emeltchenko 	if (!hdev)
9981da177e4SLinus Torvalds 		return -ENODEV;
9991da177e4SLinus Torvalds 
10000736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
10010736cfa8SMarcel Holtmann 		err = -EBUSY;
10020736cfa8SMarcel Holtmann 		goto done;
10030736cfa8SMarcel Holtmann 	}
10040736cfa8SMarcel Holtmann 
100509fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
10061da177e4SLinus Torvalds 	if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
1007a8c5fb1aSGustavo Padovan 	    inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {
10081f9b9a5dSAndre Guedes 		hci_inquiry_cache_flush(hdev);
10091da177e4SLinus Torvalds 		do_inquiry = 1;
10101da177e4SLinus Torvalds 	}
101109fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
10121da177e4SLinus Torvalds 
101304837f64SMarcel Holtmann 	timeo = ir.length * msecs_to_jiffies(2000);
101470f23020SAndrei Emeltchenko 
101570f23020SAndrei Emeltchenko 	if (do_inquiry) {
101601178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir,
101701178cd4SJohan Hedberg 				   timeo);
101870f23020SAndrei Emeltchenko 		if (err < 0)
10191da177e4SLinus Torvalds 			goto done;
10203e13fa1eSAndre Guedes 
10213e13fa1eSAndre Guedes 		/* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is
10223e13fa1eSAndre Guedes 		 * cleared). If it is interrupted by a signal, return -EINTR.
10233e13fa1eSAndre Guedes 		 */
10243e13fa1eSAndre Guedes 		if (wait_on_bit(&hdev->flags, HCI_INQUIRY, wait_inquiry,
10253e13fa1eSAndre Guedes 				TASK_INTERRUPTIBLE))
10263e13fa1eSAndre Guedes 			return -EINTR;
102770f23020SAndrei Emeltchenko 	}
10281da177e4SLinus Torvalds 
10298fc9ced3SGustavo Padovan 	/* for unlimited number of responses we will use buffer with
10308fc9ced3SGustavo Padovan 	 * 255 entries
10318fc9ced3SGustavo Padovan 	 */
10321da177e4SLinus Torvalds 	max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp;
10331da177e4SLinus Torvalds 
10341da177e4SLinus Torvalds 	/* cache_dump can't sleep. Therefore we allocate temp buffer and then
10351da177e4SLinus Torvalds 	 * copy it to the user space.
10361da177e4SLinus Torvalds 	 */
103770f23020SAndrei Emeltchenko 	buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL);
103870f23020SAndrei Emeltchenko 	if (!buf) {
10391da177e4SLinus Torvalds 		err = -ENOMEM;
10401da177e4SLinus Torvalds 		goto done;
10411da177e4SLinus Torvalds 	}
10421da177e4SLinus Torvalds 
104309fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
10441da177e4SLinus Torvalds 	ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf);
104509fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
10461da177e4SLinus Torvalds 
10471da177e4SLinus Torvalds 	BT_DBG("num_rsp %d", ir.num_rsp);
10481da177e4SLinus Torvalds 
10491da177e4SLinus Torvalds 	if (!copy_to_user(ptr, &ir, sizeof(ir))) {
10501da177e4SLinus Torvalds 		ptr += sizeof(ir);
10511da177e4SLinus Torvalds 		if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) *
10521da177e4SLinus Torvalds 				 ir.num_rsp))
10531da177e4SLinus Torvalds 			err = -EFAULT;
10541da177e4SLinus Torvalds 	} else
10551da177e4SLinus Torvalds 		err = -EFAULT;
10561da177e4SLinus Torvalds 
10571da177e4SLinus Torvalds 	kfree(buf);
10581da177e4SLinus Torvalds 
10591da177e4SLinus Torvalds done:
10601da177e4SLinus Torvalds 	hci_dev_put(hdev);
10611da177e4SLinus Torvalds 	return err;
10621da177e4SLinus Torvalds }
10631da177e4SLinus Torvalds 
10643f0f524bSJohan Hedberg static u8 create_ad(struct hci_dev *hdev, u8 *ptr)
10653f0f524bSJohan Hedberg {
10663f0f524bSJohan Hedberg 	u8 ad_len = 0, flags = 0;
10673f0f524bSJohan Hedberg 	size_t name_len;
10683f0f524bSJohan Hedberg 
10693f0f524bSJohan Hedberg 	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags))
10703f0f524bSJohan Hedberg 		flags |= LE_AD_GENERAL;
10713f0f524bSJohan Hedberg 
10723f0f524bSJohan Hedberg 	if (!lmp_bredr_capable(hdev))
10733f0f524bSJohan Hedberg 		flags |= LE_AD_NO_BREDR;
10743f0f524bSJohan Hedberg 
10753f0f524bSJohan Hedberg 	if (lmp_le_br_capable(hdev))
10763f0f524bSJohan Hedberg 		flags |= LE_AD_SIM_LE_BREDR_CTRL;
10773f0f524bSJohan Hedberg 
10783f0f524bSJohan Hedberg 	if (lmp_host_le_br_capable(hdev))
10793f0f524bSJohan Hedberg 		flags |= LE_AD_SIM_LE_BREDR_HOST;
10803f0f524bSJohan Hedberg 
10813f0f524bSJohan Hedberg 	if (flags) {
10823f0f524bSJohan Hedberg 		BT_DBG("adv flags 0x%02x", flags);
10833f0f524bSJohan Hedberg 
10843f0f524bSJohan Hedberg 		ptr[0] = 2;
10853f0f524bSJohan Hedberg 		ptr[1] = EIR_FLAGS;
10863f0f524bSJohan Hedberg 		ptr[2] = flags;
10873f0f524bSJohan Hedberg 
10883f0f524bSJohan Hedberg 		ad_len += 3;
10893f0f524bSJohan Hedberg 		ptr += 3;
10903f0f524bSJohan Hedberg 	}
10913f0f524bSJohan Hedberg 
10923f0f524bSJohan Hedberg 	if (hdev->adv_tx_power != HCI_TX_POWER_INVALID) {
10933f0f524bSJohan Hedberg 		ptr[0] = 2;
10943f0f524bSJohan Hedberg 		ptr[1] = EIR_TX_POWER;
10953f0f524bSJohan Hedberg 		ptr[2] = (u8) hdev->adv_tx_power;
10963f0f524bSJohan Hedberg 
10973f0f524bSJohan Hedberg 		ad_len += 3;
10983f0f524bSJohan Hedberg 		ptr += 3;
10993f0f524bSJohan Hedberg 	}
11003f0f524bSJohan Hedberg 
11013f0f524bSJohan Hedberg 	name_len = strlen(hdev->dev_name);
11023f0f524bSJohan Hedberg 	if (name_len > 0) {
11033f0f524bSJohan Hedberg 		size_t max_len = HCI_MAX_AD_LENGTH - ad_len - 2;
11043f0f524bSJohan Hedberg 
11053f0f524bSJohan Hedberg 		if (name_len > max_len) {
11063f0f524bSJohan Hedberg 			name_len = max_len;
11073f0f524bSJohan Hedberg 			ptr[1] = EIR_NAME_SHORT;
11083f0f524bSJohan Hedberg 		} else
11093f0f524bSJohan Hedberg 			ptr[1] = EIR_NAME_COMPLETE;
11103f0f524bSJohan Hedberg 
11113f0f524bSJohan Hedberg 		ptr[0] = name_len + 1;
11123f0f524bSJohan Hedberg 
11133f0f524bSJohan Hedberg 		memcpy(ptr + 2, hdev->dev_name, name_len);
11143f0f524bSJohan Hedberg 
11153f0f524bSJohan Hedberg 		ad_len += (name_len + 2);
11163f0f524bSJohan Hedberg 		ptr += (name_len + 2);
11173f0f524bSJohan Hedberg 	}
11183f0f524bSJohan Hedberg 
11193f0f524bSJohan Hedberg 	return ad_len;
11203f0f524bSJohan Hedberg }
11213f0f524bSJohan Hedberg 
112204b4edcbSJohan Hedberg void hci_update_ad(struct hci_request *req)
11233f0f524bSJohan Hedberg {
112404b4edcbSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
11253f0f524bSJohan Hedberg 	struct hci_cp_le_set_adv_data cp;
11263f0f524bSJohan Hedberg 	u8 len;
11273f0f524bSJohan Hedberg 
112804b4edcbSJohan Hedberg 	if (!lmp_le_capable(hdev))
112904b4edcbSJohan Hedberg 		return;
11303f0f524bSJohan Hedberg 
11313f0f524bSJohan Hedberg 	memset(&cp, 0, sizeof(cp));
11323f0f524bSJohan Hedberg 
11333f0f524bSJohan Hedberg 	len = create_ad(hdev, cp.data);
11343f0f524bSJohan Hedberg 
11353f0f524bSJohan Hedberg 	if (hdev->adv_data_len == len &&
113604b4edcbSJohan Hedberg 	    memcmp(cp.data, hdev->adv_data, len) == 0)
113704b4edcbSJohan Hedberg 		return;
11383f0f524bSJohan Hedberg 
11393f0f524bSJohan Hedberg 	memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
11403f0f524bSJohan Hedberg 	hdev->adv_data_len = len;
11413f0f524bSJohan Hedberg 
11423f0f524bSJohan Hedberg 	cp.length = len;
11433f0f524bSJohan Hedberg 
114404b4edcbSJohan Hedberg 	hci_req_add(req, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp);
11453f0f524bSJohan Hedberg }
11463f0f524bSJohan Hedberg 
11471da177e4SLinus Torvalds /* ---- HCI ioctl helpers ---- */
11481da177e4SLinus Torvalds 
11491da177e4SLinus Torvalds int hci_dev_open(__u16 dev)
11501da177e4SLinus Torvalds {
11511da177e4SLinus Torvalds 	struct hci_dev *hdev;
11521da177e4SLinus Torvalds 	int ret = 0;
11531da177e4SLinus Torvalds 
11545a08ecceSAndrei Emeltchenko 	hdev = hci_dev_get(dev);
11555a08ecceSAndrei Emeltchenko 	if (!hdev)
11561da177e4SLinus Torvalds 		return -ENODEV;
11571da177e4SLinus Torvalds 
11581da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
11591da177e4SLinus Torvalds 
11601da177e4SLinus Torvalds 	hci_req_lock(hdev);
11611da177e4SLinus Torvalds 
116294324962SJohan Hovold 	if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) {
116394324962SJohan Hovold 		ret = -ENODEV;
116494324962SJohan Hovold 		goto done;
116594324962SJohan Hovold 	}
116694324962SJohan Hovold 
1167611b30f7SMarcel Holtmann 	if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) {
1168611b30f7SMarcel Holtmann 		ret = -ERFKILL;
1169611b30f7SMarcel Holtmann 		goto done;
1170611b30f7SMarcel Holtmann 	}
1171611b30f7SMarcel Holtmann 
11721da177e4SLinus Torvalds 	if (test_bit(HCI_UP, &hdev->flags)) {
11731da177e4SLinus Torvalds 		ret = -EALREADY;
11741da177e4SLinus Torvalds 		goto done;
11751da177e4SLinus Torvalds 	}
11761da177e4SLinus Torvalds 
11771da177e4SLinus Torvalds 	if (hdev->open(hdev)) {
11781da177e4SLinus Torvalds 		ret = -EIO;
11791da177e4SLinus Torvalds 		goto done;
11801da177e4SLinus Torvalds 	}
11811da177e4SLinus Torvalds 
11821da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
11831da177e4SLinus Torvalds 	set_bit(HCI_INIT, &hdev->flags);
1184f41c70c4SMarcel Holtmann 
1185f41c70c4SMarcel Holtmann 	if (hdev->setup && test_bit(HCI_SETUP, &hdev->dev_flags))
1186f41c70c4SMarcel Holtmann 		ret = hdev->setup(hdev);
1187f41c70c4SMarcel Holtmann 
1188f41c70c4SMarcel Holtmann 	if (!ret) {
1189f41c70c4SMarcel Holtmann 		/* Treat all non BR/EDR controllers as raw devices if
1190f41c70c4SMarcel Holtmann 		 * enable_hs is not set.
1191f41c70c4SMarcel Holtmann 		 */
1192f41c70c4SMarcel Holtmann 		if (hdev->dev_type != HCI_BREDR && !enable_hs)
1193f41c70c4SMarcel Holtmann 			set_bit(HCI_RAW, &hdev->flags);
1194f41c70c4SMarcel Holtmann 
1195f41c70c4SMarcel Holtmann 		if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
1196f41c70c4SMarcel Holtmann 			set_bit(HCI_RAW, &hdev->flags);
1197f41c70c4SMarcel Holtmann 
11980736cfa8SMarcel Holtmann 		if (!test_bit(HCI_RAW, &hdev->flags) &&
11990736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
12002177bab5SJohan Hedberg 			ret = __hci_init(hdev);
12011da177e4SLinus Torvalds 	}
12021da177e4SLinus Torvalds 
1203f41c70c4SMarcel Holtmann 	clear_bit(HCI_INIT, &hdev->flags);
1204f41c70c4SMarcel Holtmann 
12051da177e4SLinus Torvalds 	if (!ret) {
12061da177e4SLinus Torvalds 		hci_dev_hold(hdev);
12071da177e4SLinus Torvalds 		set_bit(HCI_UP, &hdev->flags);
12081da177e4SLinus Torvalds 		hci_notify(hdev, HCI_DEV_UP);
1209bb4b2a9aSAndrei Emeltchenko 		if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
12100736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
1211bb4b2a9aSAndrei Emeltchenko 		    mgmt_valid_hdev(hdev)) {
121209fd0de5SGustavo F. Padovan 			hci_dev_lock(hdev);
1213744cf19eSJohan Hedberg 			mgmt_powered(hdev, 1);
121409fd0de5SGustavo F. Padovan 			hci_dev_unlock(hdev);
121556e5cb86SJohan Hedberg 		}
12161da177e4SLinus Torvalds 	} else {
12171da177e4SLinus Torvalds 		/* Init failed, cleanup */
12183eff45eaSGustavo F. Padovan 		flush_work(&hdev->tx_work);
1219c347b765SGustavo F. Padovan 		flush_work(&hdev->cmd_work);
1220b78752ccSMarcel Holtmann 		flush_work(&hdev->rx_work);
12211da177e4SLinus Torvalds 
12221da177e4SLinus Torvalds 		skb_queue_purge(&hdev->cmd_q);
12231da177e4SLinus Torvalds 		skb_queue_purge(&hdev->rx_q);
12241da177e4SLinus Torvalds 
12251da177e4SLinus Torvalds 		if (hdev->flush)
12261da177e4SLinus Torvalds 			hdev->flush(hdev);
12271da177e4SLinus Torvalds 
12281da177e4SLinus Torvalds 		if (hdev->sent_cmd) {
12291da177e4SLinus Torvalds 			kfree_skb(hdev->sent_cmd);
12301da177e4SLinus Torvalds 			hdev->sent_cmd = NULL;
12311da177e4SLinus Torvalds 		}
12321da177e4SLinus Torvalds 
12331da177e4SLinus Torvalds 		hdev->close(hdev);
12341da177e4SLinus Torvalds 		hdev->flags = 0;
12351da177e4SLinus Torvalds 	}
12361da177e4SLinus Torvalds 
12371da177e4SLinus Torvalds done:
12381da177e4SLinus Torvalds 	hci_req_unlock(hdev);
12391da177e4SLinus Torvalds 	hci_dev_put(hdev);
12401da177e4SLinus Torvalds 	return ret;
12411da177e4SLinus Torvalds }
12421da177e4SLinus Torvalds 
12431da177e4SLinus Torvalds static int hci_dev_do_close(struct hci_dev *hdev)
12441da177e4SLinus Torvalds {
12451da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
12461da177e4SLinus Torvalds 
124778c04c0bSVinicius Costa Gomes 	cancel_delayed_work(&hdev->power_off);
124878c04c0bSVinicius Costa Gomes 
12491da177e4SLinus Torvalds 	hci_req_cancel(hdev, ENODEV);
12501da177e4SLinus Torvalds 	hci_req_lock(hdev);
12511da177e4SLinus Torvalds 
12521da177e4SLinus Torvalds 	if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
1253b79f44c1SVinicius Costa Gomes 		del_timer_sync(&hdev->cmd_timer);
12541da177e4SLinus Torvalds 		hci_req_unlock(hdev);
12551da177e4SLinus Torvalds 		return 0;
12561da177e4SLinus Torvalds 	}
12571da177e4SLinus Torvalds 
12583eff45eaSGustavo F. Padovan 	/* Flush RX and TX works */
12593eff45eaSGustavo F. Padovan 	flush_work(&hdev->tx_work);
1260b78752ccSMarcel Holtmann 	flush_work(&hdev->rx_work);
12611da177e4SLinus Torvalds 
126216ab91abSJohan Hedberg 	if (hdev->discov_timeout > 0) {
1263e0f9309fSJohan Hedberg 		cancel_delayed_work(&hdev->discov_off);
126416ab91abSJohan Hedberg 		hdev->discov_timeout = 0;
12655e5282bbSJohan Hedberg 		clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
126616ab91abSJohan Hedberg 	}
126716ab91abSJohan Hedberg 
1268a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
12697d78525dSJohan Hedberg 		cancel_delayed_work(&hdev->service_cache);
12707d78525dSJohan Hedberg 
12717ba8b4beSAndre Guedes 	cancel_delayed_work_sync(&hdev->le_scan_disable);
12727ba8b4beSAndre Guedes 
127309fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
12741f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
12751da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
127609fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
12771da177e4SLinus Torvalds 
12781da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_DOWN);
12791da177e4SLinus Torvalds 
12801da177e4SLinus Torvalds 	if (hdev->flush)
12811da177e4SLinus Torvalds 		hdev->flush(hdev);
12821da177e4SLinus Torvalds 
12831da177e4SLinus Torvalds 	/* Reset device */
12841da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
12851da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
12868af59467SJohan Hedberg 	if (!test_bit(HCI_RAW, &hdev->flags) &&
1287a6c511c6SSzymon Janc 	    test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) {
12881da177e4SLinus Torvalds 		set_bit(HCI_INIT, &hdev->flags);
128901178cd4SJohan Hedberg 		__hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT);
12901da177e4SLinus Torvalds 		clear_bit(HCI_INIT, &hdev->flags);
12911da177e4SLinus Torvalds 	}
12921da177e4SLinus Torvalds 
1293c347b765SGustavo F. Padovan 	/* flush cmd  work */
1294c347b765SGustavo F. Padovan 	flush_work(&hdev->cmd_work);
12951da177e4SLinus Torvalds 
12961da177e4SLinus Torvalds 	/* Drop queues */
12971da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
12981da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
12991da177e4SLinus Torvalds 	skb_queue_purge(&hdev->raw_q);
13001da177e4SLinus Torvalds 
13011da177e4SLinus Torvalds 	/* Drop last sent command */
13021da177e4SLinus Torvalds 	if (hdev->sent_cmd) {
1303b79f44c1SVinicius Costa Gomes 		del_timer_sync(&hdev->cmd_timer);
13041da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
13051da177e4SLinus Torvalds 		hdev->sent_cmd = NULL;
13061da177e4SLinus Torvalds 	}
13071da177e4SLinus Torvalds 
1308b6ddb638SJohan Hedberg 	kfree_skb(hdev->recv_evt);
1309b6ddb638SJohan Hedberg 	hdev->recv_evt = NULL;
1310b6ddb638SJohan Hedberg 
13111da177e4SLinus Torvalds 	/* After this point our queues are empty
13121da177e4SLinus Torvalds 	 * and no tasks are scheduled. */
13131da177e4SLinus Torvalds 	hdev->close(hdev);
13141da177e4SLinus Torvalds 
131535b973c9SJohan Hedberg 	/* Clear flags */
131635b973c9SJohan Hedberg 	hdev->flags = 0;
131735b973c9SJohan Hedberg 	hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
131835b973c9SJohan Hedberg 
1319bb4b2a9aSAndrei Emeltchenko 	if (!test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags) &&
1320bb4b2a9aSAndrei Emeltchenko 	    mgmt_valid_hdev(hdev)) {
132109fd0de5SGustavo F. Padovan 		hci_dev_lock(hdev);
1322744cf19eSJohan Hedberg 		mgmt_powered(hdev, 0);
132309fd0de5SGustavo F. Padovan 		hci_dev_unlock(hdev);
13248ee56540SMarcel Holtmann 	}
13255add6af8SJohan Hedberg 
1326ced5c338SAndrei Emeltchenko 	/* Controller radio is available but is currently powered down */
1327ced5c338SAndrei Emeltchenko 	hdev->amp_status = 0;
1328ced5c338SAndrei Emeltchenko 
1329e59fda8dSJohan Hedberg 	memset(hdev->eir, 0, sizeof(hdev->eir));
133009b3c3fbSJohan Hedberg 	memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
1331e59fda8dSJohan Hedberg 
13321da177e4SLinus Torvalds 	hci_req_unlock(hdev);
13331da177e4SLinus Torvalds 
13341da177e4SLinus Torvalds 	hci_dev_put(hdev);
13351da177e4SLinus Torvalds 	return 0;
13361da177e4SLinus Torvalds }
13371da177e4SLinus Torvalds 
13381da177e4SLinus Torvalds int hci_dev_close(__u16 dev)
13391da177e4SLinus Torvalds {
13401da177e4SLinus Torvalds 	struct hci_dev *hdev;
13411da177e4SLinus Torvalds 	int err;
13421da177e4SLinus Torvalds 
134370f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
134470f23020SAndrei Emeltchenko 	if (!hdev)
13451da177e4SLinus Torvalds 		return -ENODEV;
13468ee56540SMarcel Holtmann 
13470736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
13480736cfa8SMarcel Holtmann 		err = -EBUSY;
13490736cfa8SMarcel Holtmann 		goto done;
13500736cfa8SMarcel Holtmann 	}
13510736cfa8SMarcel Holtmann 
13528ee56540SMarcel Holtmann 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
13538ee56540SMarcel Holtmann 		cancel_delayed_work(&hdev->power_off);
13548ee56540SMarcel Holtmann 
13551da177e4SLinus Torvalds 	err = hci_dev_do_close(hdev);
13568ee56540SMarcel Holtmann 
13570736cfa8SMarcel Holtmann done:
13581da177e4SLinus Torvalds 	hci_dev_put(hdev);
13591da177e4SLinus Torvalds 	return err;
13601da177e4SLinus Torvalds }
13611da177e4SLinus Torvalds 
13621da177e4SLinus Torvalds int hci_dev_reset(__u16 dev)
13631da177e4SLinus Torvalds {
13641da177e4SLinus Torvalds 	struct hci_dev *hdev;
13651da177e4SLinus Torvalds 	int ret = 0;
13661da177e4SLinus Torvalds 
136770f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
136870f23020SAndrei Emeltchenko 	if (!hdev)
13691da177e4SLinus Torvalds 		return -ENODEV;
13701da177e4SLinus Torvalds 
13711da177e4SLinus Torvalds 	hci_req_lock(hdev);
13721da177e4SLinus Torvalds 
1373808a049eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags)) {
1374808a049eSMarcel Holtmann 		ret = -ENETDOWN;
13751da177e4SLinus Torvalds 		goto done;
1376808a049eSMarcel Holtmann 	}
13771da177e4SLinus Torvalds 
13780736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
13790736cfa8SMarcel Holtmann 		ret = -EBUSY;
13800736cfa8SMarcel Holtmann 		goto done;
13810736cfa8SMarcel Holtmann 	}
13820736cfa8SMarcel Holtmann 
13831da177e4SLinus Torvalds 	/* Drop queues */
13841da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
13851da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
13861da177e4SLinus Torvalds 
138709fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
13881f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
13891da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
139009fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
13911da177e4SLinus Torvalds 
13921da177e4SLinus Torvalds 	if (hdev->flush)
13931da177e4SLinus Torvalds 		hdev->flush(hdev);
13941da177e4SLinus Torvalds 
13951da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
13966ed58ec5SVille Tervo 	hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
13971da177e4SLinus Torvalds 
13981da177e4SLinus Torvalds 	if (!test_bit(HCI_RAW, &hdev->flags))
139901178cd4SJohan Hedberg 		ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT);
14001da177e4SLinus Torvalds 
14011da177e4SLinus Torvalds done:
14021da177e4SLinus Torvalds 	hci_req_unlock(hdev);
14031da177e4SLinus Torvalds 	hci_dev_put(hdev);
14041da177e4SLinus Torvalds 	return ret;
14051da177e4SLinus Torvalds }
14061da177e4SLinus Torvalds 
14071da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev)
14081da177e4SLinus Torvalds {
14091da177e4SLinus Torvalds 	struct hci_dev *hdev;
14101da177e4SLinus Torvalds 	int ret = 0;
14111da177e4SLinus Torvalds 
141270f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
141370f23020SAndrei Emeltchenko 	if (!hdev)
14141da177e4SLinus Torvalds 		return -ENODEV;
14151da177e4SLinus Torvalds 
14160736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
14170736cfa8SMarcel Holtmann 		ret = -EBUSY;
14180736cfa8SMarcel Holtmann 		goto done;
14190736cfa8SMarcel Holtmann 	}
14200736cfa8SMarcel Holtmann 
14211da177e4SLinus Torvalds 	memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
14221da177e4SLinus Torvalds 
14230736cfa8SMarcel Holtmann done:
14241da177e4SLinus Torvalds 	hci_dev_put(hdev);
14251da177e4SLinus Torvalds 	return ret;
14261da177e4SLinus Torvalds }
14271da177e4SLinus Torvalds 
14281da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg)
14291da177e4SLinus Torvalds {
14301da177e4SLinus Torvalds 	struct hci_dev *hdev;
14311da177e4SLinus Torvalds 	struct hci_dev_req dr;
14321da177e4SLinus Torvalds 	int err = 0;
14331da177e4SLinus Torvalds 
14341da177e4SLinus Torvalds 	if (copy_from_user(&dr, arg, sizeof(dr)))
14351da177e4SLinus Torvalds 		return -EFAULT;
14361da177e4SLinus Torvalds 
143770f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dr.dev_id);
143870f23020SAndrei Emeltchenko 	if (!hdev)
14391da177e4SLinus Torvalds 		return -ENODEV;
14401da177e4SLinus Torvalds 
14410736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
14420736cfa8SMarcel Holtmann 		err = -EBUSY;
14430736cfa8SMarcel Holtmann 		goto done;
14440736cfa8SMarcel Holtmann 	}
14450736cfa8SMarcel Holtmann 
14461da177e4SLinus Torvalds 	switch (cmd) {
14471da177e4SLinus Torvalds 	case HCISETAUTH:
144801178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
14495f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
14501da177e4SLinus Torvalds 		break;
14511da177e4SLinus Torvalds 
14521da177e4SLinus Torvalds 	case HCISETENCRYPT:
14531da177e4SLinus Torvalds 		if (!lmp_encrypt_capable(hdev)) {
14541da177e4SLinus Torvalds 			err = -EOPNOTSUPP;
14551da177e4SLinus Torvalds 			break;
14561da177e4SLinus Torvalds 		}
14571da177e4SLinus Torvalds 
14581da177e4SLinus Torvalds 		if (!test_bit(HCI_AUTH, &hdev->flags)) {
14591da177e4SLinus Torvalds 			/* Auth must be enabled first */
146001178cd4SJohan Hedberg 			err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
14615f246e89SAndrei Emeltchenko 					   HCI_INIT_TIMEOUT);
14621da177e4SLinus Torvalds 			if (err)
14631da177e4SLinus Torvalds 				break;
14641da177e4SLinus Torvalds 		}
14651da177e4SLinus Torvalds 
146601178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
14675f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
14681da177e4SLinus Torvalds 		break;
14691da177e4SLinus Torvalds 
14701da177e4SLinus Torvalds 	case HCISETSCAN:
147101178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
14725f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
14731da177e4SLinus Torvalds 		break;
14741da177e4SLinus Torvalds 
14751da177e4SLinus Torvalds 	case HCISETLINKPOL:
147601178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
14775f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
14781da177e4SLinus Torvalds 		break;
14791da177e4SLinus Torvalds 
14801da177e4SLinus Torvalds 	case HCISETLINKMODE:
1481e4e8e37cSMarcel Holtmann 		hdev->link_mode = ((__u16) dr.dev_opt) &
1482e4e8e37cSMarcel Holtmann 					(HCI_LM_MASTER | HCI_LM_ACCEPT);
1483e4e8e37cSMarcel Holtmann 		break;
1484e4e8e37cSMarcel Holtmann 
1485e4e8e37cSMarcel Holtmann 	case HCISETPTYPE:
1486e4e8e37cSMarcel Holtmann 		hdev->pkt_type = (__u16) dr.dev_opt;
14871da177e4SLinus Torvalds 		break;
14881da177e4SLinus Torvalds 
14891da177e4SLinus Torvalds 	case HCISETACLMTU:
14901da177e4SLinus Torvalds 		hdev->acl_mtu  = *((__u16 *) &dr.dev_opt + 1);
14911da177e4SLinus Torvalds 		hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0);
14921da177e4SLinus Torvalds 		break;
14931da177e4SLinus Torvalds 
14941da177e4SLinus Torvalds 	case HCISETSCOMTU:
14951da177e4SLinus Torvalds 		hdev->sco_mtu  = *((__u16 *) &dr.dev_opt + 1);
14961da177e4SLinus Torvalds 		hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0);
14971da177e4SLinus Torvalds 		break;
14981da177e4SLinus Torvalds 
14991da177e4SLinus Torvalds 	default:
15001da177e4SLinus Torvalds 		err = -EINVAL;
15011da177e4SLinus Torvalds 		break;
15021da177e4SLinus Torvalds 	}
1503e4e8e37cSMarcel Holtmann 
15040736cfa8SMarcel Holtmann done:
15051da177e4SLinus Torvalds 	hci_dev_put(hdev);
15061da177e4SLinus Torvalds 	return err;
15071da177e4SLinus Torvalds }
15081da177e4SLinus Torvalds 
15091da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg)
15101da177e4SLinus Torvalds {
15118035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev;
15121da177e4SLinus Torvalds 	struct hci_dev_list_req *dl;
15131da177e4SLinus Torvalds 	struct hci_dev_req *dr;
15141da177e4SLinus Torvalds 	int n = 0, size, err;
15151da177e4SLinus Torvalds 	__u16 dev_num;
15161da177e4SLinus Torvalds 
15171da177e4SLinus Torvalds 	if (get_user(dev_num, (__u16 __user *) arg))
15181da177e4SLinus Torvalds 		return -EFAULT;
15191da177e4SLinus Torvalds 
15201da177e4SLinus Torvalds 	if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr))
15211da177e4SLinus Torvalds 		return -EINVAL;
15221da177e4SLinus Torvalds 
15231da177e4SLinus Torvalds 	size = sizeof(*dl) + dev_num * sizeof(*dr);
15241da177e4SLinus Torvalds 
152570f23020SAndrei Emeltchenko 	dl = kzalloc(size, GFP_KERNEL);
152670f23020SAndrei Emeltchenko 	if (!dl)
15271da177e4SLinus Torvalds 		return -ENOMEM;
15281da177e4SLinus Torvalds 
15291da177e4SLinus Torvalds 	dr = dl->dev_req;
15301da177e4SLinus Torvalds 
1531f20d09d5SGustavo F. Padovan 	read_lock(&hci_dev_list_lock);
15328035ded4SLuiz Augusto von Dentz 	list_for_each_entry(hdev, &hci_dev_list, list) {
1533a8b2d5c2SJohan Hedberg 		if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
1534e0f9309fSJohan Hedberg 			cancel_delayed_work(&hdev->power_off);
1535c542a06cSJohan Hedberg 
1536a8b2d5c2SJohan Hedberg 		if (!test_bit(HCI_MGMT, &hdev->dev_flags))
1537a8b2d5c2SJohan Hedberg 			set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1538c542a06cSJohan Hedberg 
15391da177e4SLinus Torvalds 		(dr + n)->dev_id  = hdev->id;
15401da177e4SLinus Torvalds 		(dr + n)->dev_opt = hdev->flags;
1541c542a06cSJohan Hedberg 
15421da177e4SLinus Torvalds 		if (++n >= dev_num)
15431da177e4SLinus Torvalds 			break;
15441da177e4SLinus Torvalds 	}
1545f20d09d5SGustavo F. Padovan 	read_unlock(&hci_dev_list_lock);
15461da177e4SLinus Torvalds 
15471da177e4SLinus Torvalds 	dl->dev_num = n;
15481da177e4SLinus Torvalds 	size = sizeof(*dl) + n * sizeof(*dr);
15491da177e4SLinus Torvalds 
15501da177e4SLinus Torvalds 	err = copy_to_user(arg, dl, size);
15511da177e4SLinus Torvalds 	kfree(dl);
15521da177e4SLinus Torvalds 
15531da177e4SLinus Torvalds 	return err ? -EFAULT : 0;
15541da177e4SLinus Torvalds }
15551da177e4SLinus Torvalds 
15561da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg)
15571da177e4SLinus Torvalds {
15581da177e4SLinus Torvalds 	struct hci_dev *hdev;
15591da177e4SLinus Torvalds 	struct hci_dev_info di;
15601da177e4SLinus Torvalds 	int err = 0;
15611da177e4SLinus Torvalds 
15621da177e4SLinus Torvalds 	if (copy_from_user(&di, arg, sizeof(di)))
15631da177e4SLinus Torvalds 		return -EFAULT;
15641da177e4SLinus Torvalds 
156570f23020SAndrei Emeltchenko 	hdev = hci_dev_get(di.dev_id);
156670f23020SAndrei Emeltchenko 	if (!hdev)
15671da177e4SLinus Torvalds 		return -ENODEV;
15681da177e4SLinus Torvalds 
1569a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
15703243553fSJohan Hedberg 		cancel_delayed_work_sync(&hdev->power_off);
1571ab81cbf9SJohan Hedberg 
1572a8b2d5c2SJohan Hedberg 	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
1573a8b2d5c2SJohan Hedberg 		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1574c542a06cSJohan Hedberg 
15751da177e4SLinus Torvalds 	strcpy(di.name, hdev->name);
15761da177e4SLinus Torvalds 	di.bdaddr   = hdev->bdaddr;
1577943da25dSMarcel Holtmann 	di.type     = (hdev->bus & 0x0f) | (hdev->dev_type << 4);
15781da177e4SLinus Torvalds 	di.flags    = hdev->flags;
15791da177e4SLinus Torvalds 	di.pkt_type = hdev->pkt_type;
1580572c7f84SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
15811da177e4SLinus Torvalds 		di.acl_mtu  = hdev->acl_mtu;
15821da177e4SLinus Torvalds 		di.acl_pkts = hdev->acl_pkts;
15831da177e4SLinus Torvalds 		di.sco_mtu  = hdev->sco_mtu;
15841da177e4SLinus Torvalds 		di.sco_pkts = hdev->sco_pkts;
1585572c7f84SJohan Hedberg 	} else {
1586572c7f84SJohan Hedberg 		di.acl_mtu  = hdev->le_mtu;
1587572c7f84SJohan Hedberg 		di.acl_pkts = hdev->le_pkts;
1588572c7f84SJohan Hedberg 		di.sco_mtu  = 0;
1589572c7f84SJohan Hedberg 		di.sco_pkts = 0;
1590572c7f84SJohan Hedberg 	}
15911da177e4SLinus Torvalds 	di.link_policy = hdev->link_policy;
15921da177e4SLinus Torvalds 	di.link_mode   = hdev->link_mode;
15931da177e4SLinus Torvalds 
15941da177e4SLinus Torvalds 	memcpy(&di.stat, &hdev->stat, sizeof(di.stat));
15951da177e4SLinus Torvalds 	memcpy(&di.features, &hdev->features, sizeof(di.features));
15961da177e4SLinus Torvalds 
15971da177e4SLinus Torvalds 	if (copy_to_user(arg, &di, sizeof(di)))
15981da177e4SLinus Torvalds 		err = -EFAULT;
15991da177e4SLinus Torvalds 
16001da177e4SLinus Torvalds 	hci_dev_put(hdev);
16011da177e4SLinus Torvalds 
16021da177e4SLinus Torvalds 	return err;
16031da177e4SLinus Torvalds }
16041da177e4SLinus Torvalds 
16051da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */
16061da177e4SLinus Torvalds 
1607611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked)
1608611b30f7SMarcel Holtmann {
1609611b30f7SMarcel Holtmann 	struct hci_dev *hdev = data;
1610611b30f7SMarcel Holtmann 
1611611b30f7SMarcel Holtmann 	BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
1612611b30f7SMarcel Holtmann 
16130736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
16140736cfa8SMarcel Holtmann 		return -EBUSY;
16150736cfa8SMarcel Holtmann 
1616611b30f7SMarcel Holtmann 	if (!blocked)
1617611b30f7SMarcel Holtmann 		return 0;
1618611b30f7SMarcel Holtmann 
1619611b30f7SMarcel Holtmann 	hci_dev_do_close(hdev);
1620611b30f7SMarcel Holtmann 
1621611b30f7SMarcel Holtmann 	return 0;
1622611b30f7SMarcel Holtmann }
1623611b30f7SMarcel Holtmann 
1624611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = {
1625611b30f7SMarcel Holtmann 	.set_block = hci_rfkill_set_block,
1626611b30f7SMarcel Holtmann };
1627611b30f7SMarcel Holtmann 
1628ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work)
1629ab81cbf9SJohan Hedberg {
1630ab81cbf9SJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev, power_on);
163196570ffcSJohan Hedberg 	int err;
1632ab81cbf9SJohan Hedberg 
1633ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
1634ab81cbf9SJohan Hedberg 
163596570ffcSJohan Hedberg 	err = hci_dev_open(hdev->id);
163696570ffcSJohan Hedberg 	if (err < 0) {
163796570ffcSJohan Hedberg 		mgmt_set_powered_failed(hdev, err);
1638ab81cbf9SJohan Hedberg 		return;
163996570ffcSJohan Hedberg 	}
1640ab81cbf9SJohan Hedberg 
1641a8b2d5c2SJohan Hedberg 	if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
164219202573SJohan Hedberg 		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
164319202573SJohan Hedberg 				   HCI_AUTO_OFF_TIMEOUT);
1644ab81cbf9SJohan Hedberg 
1645a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))
1646744cf19eSJohan Hedberg 		mgmt_index_added(hdev);
1647ab81cbf9SJohan Hedberg }
1648ab81cbf9SJohan Hedberg 
1649ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work)
1650ab81cbf9SJohan Hedberg {
16513243553fSJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev,
16523243553fSJohan Hedberg 					    power_off.work);
1653ab81cbf9SJohan Hedberg 
1654ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
1655ab81cbf9SJohan Hedberg 
16568ee56540SMarcel Holtmann 	hci_dev_do_close(hdev);
1657ab81cbf9SJohan Hedberg }
1658ab81cbf9SJohan Hedberg 
165916ab91abSJohan Hedberg static void hci_discov_off(struct work_struct *work)
166016ab91abSJohan Hedberg {
166116ab91abSJohan Hedberg 	struct hci_dev *hdev;
166216ab91abSJohan Hedberg 	u8 scan = SCAN_PAGE;
166316ab91abSJohan Hedberg 
166416ab91abSJohan Hedberg 	hdev = container_of(work, struct hci_dev, discov_off.work);
166516ab91abSJohan Hedberg 
166616ab91abSJohan Hedberg 	BT_DBG("%s", hdev->name);
166716ab91abSJohan Hedberg 
166809fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
166916ab91abSJohan Hedberg 
167016ab91abSJohan Hedberg 	hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
167116ab91abSJohan Hedberg 
167216ab91abSJohan Hedberg 	hdev->discov_timeout = 0;
167316ab91abSJohan Hedberg 
167409fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
167516ab91abSJohan Hedberg }
167616ab91abSJohan Hedberg 
16772aeb9a1aSJohan Hedberg int hci_uuids_clear(struct hci_dev *hdev)
16782aeb9a1aSJohan Hedberg {
16794821002cSJohan Hedberg 	struct bt_uuid *uuid, *tmp;
16802aeb9a1aSJohan Hedberg 
16814821002cSJohan Hedberg 	list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) {
16824821002cSJohan Hedberg 		list_del(&uuid->list);
16832aeb9a1aSJohan Hedberg 		kfree(uuid);
16842aeb9a1aSJohan Hedberg 	}
16852aeb9a1aSJohan Hedberg 
16862aeb9a1aSJohan Hedberg 	return 0;
16872aeb9a1aSJohan Hedberg }
16882aeb9a1aSJohan Hedberg 
168955ed8ca1SJohan Hedberg int hci_link_keys_clear(struct hci_dev *hdev)
169055ed8ca1SJohan Hedberg {
169155ed8ca1SJohan Hedberg 	struct list_head *p, *n;
169255ed8ca1SJohan Hedberg 
169355ed8ca1SJohan Hedberg 	list_for_each_safe(p, n, &hdev->link_keys) {
169455ed8ca1SJohan Hedberg 		struct link_key *key;
169555ed8ca1SJohan Hedberg 
169655ed8ca1SJohan Hedberg 		key = list_entry(p, struct link_key, list);
169755ed8ca1SJohan Hedberg 
169855ed8ca1SJohan Hedberg 		list_del(p);
169955ed8ca1SJohan Hedberg 		kfree(key);
170055ed8ca1SJohan Hedberg 	}
170155ed8ca1SJohan Hedberg 
170255ed8ca1SJohan Hedberg 	return 0;
170355ed8ca1SJohan Hedberg }
170455ed8ca1SJohan Hedberg 
1705b899efafSVinicius Costa Gomes int hci_smp_ltks_clear(struct hci_dev *hdev)
1706b899efafSVinicius Costa Gomes {
1707b899efafSVinicius Costa Gomes 	struct smp_ltk *k, *tmp;
1708b899efafSVinicius Costa Gomes 
1709b899efafSVinicius Costa Gomes 	list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
1710b899efafSVinicius Costa Gomes 		list_del(&k->list);
1711b899efafSVinicius Costa Gomes 		kfree(k);
1712b899efafSVinicius Costa Gomes 	}
1713b899efafSVinicius Costa Gomes 
1714b899efafSVinicius Costa Gomes 	return 0;
1715b899efafSVinicius Costa Gomes }
1716b899efafSVinicius Costa Gomes 
171755ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
171855ed8ca1SJohan Hedberg {
171955ed8ca1SJohan Hedberg 	struct link_key *k;
172055ed8ca1SJohan Hedberg 
17218035ded4SLuiz Augusto von Dentz 	list_for_each_entry(k, &hdev->link_keys, list)
172255ed8ca1SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) == 0)
172355ed8ca1SJohan Hedberg 			return k;
172455ed8ca1SJohan Hedberg 
172555ed8ca1SJohan Hedberg 	return NULL;
172655ed8ca1SJohan Hedberg }
172755ed8ca1SJohan Hedberg 
1728745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
1729d25e28abSJohan Hedberg 			       u8 key_type, u8 old_key_type)
1730d25e28abSJohan Hedberg {
1731d25e28abSJohan Hedberg 	/* Legacy key */
1732d25e28abSJohan Hedberg 	if (key_type < 0x03)
1733745c0ce3SVishal Agarwal 		return true;
1734d25e28abSJohan Hedberg 
1735d25e28abSJohan Hedberg 	/* Debug keys are insecure so don't store them persistently */
1736d25e28abSJohan Hedberg 	if (key_type == HCI_LK_DEBUG_COMBINATION)
1737745c0ce3SVishal Agarwal 		return false;
1738d25e28abSJohan Hedberg 
1739d25e28abSJohan Hedberg 	/* Changed combination key and there's no previous one */
1740d25e28abSJohan Hedberg 	if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff)
1741745c0ce3SVishal Agarwal 		return false;
1742d25e28abSJohan Hedberg 
1743d25e28abSJohan Hedberg 	/* Security mode 3 case */
1744d25e28abSJohan Hedberg 	if (!conn)
1745745c0ce3SVishal Agarwal 		return true;
1746d25e28abSJohan Hedberg 
1747d25e28abSJohan Hedberg 	/* Neither local nor remote side had no-bonding as requirement */
1748d25e28abSJohan Hedberg 	if (conn->auth_type > 0x01 && conn->remote_auth > 0x01)
1749745c0ce3SVishal Agarwal 		return true;
1750d25e28abSJohan Hedberg 
1751d25e28abSJohan Hedberg 	/* Local side had dedicated bonding as requirement */
1752d25e28abSJohan Hedberg 	if (conn->auth_type == 0x02 || conn->auth_type == 0x03)
1753745c0ce3SVishal Agarwal 		return true;
1754d25e28abSJohan Hedberg 
1755d25e28abSJohan Hedberg 	/* Remote side had dedicated bonding as requirement */
1756d25e28abSJohan Hedberg 	if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03)
1757745c0ce3SVishal Agarwal 		return true;
1758d25e28abSJohan Hedberg 
1759d25e28abSJohan Hedberg 	/* If none of the above criteria match, then don't store the key
1760d25e28abSJohan Hedberg 	 * persistently */
1761745c0ce3SVishal Agarwal 	return false;
1762d25e28abSJohan Hedberg }
1763d25e28abSJohan Hedberg 
1764c9839a11SVinicius Costa Gomes struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8])
176575d262c2SVinicius Costa Gomes {
1766c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
176775d262c2SVinicius Costa Gomes 
1768c9839a11SVinicius Costa Gomes 	list_for_each_entry(k, &hdev->long_term_keys, list) {
1769c9839a11SVinicius Costa Gomes 		if (k->ediv != ediv ||
1770c9839a11SVinicius Costa Gomes 		    memcmp(rand, k->rand, sizeof(k->rand)))
177175d262c2SVinicius Costa Gomes 			continue;
177275d262c2SVinicius Costa Gomes 
177375d262c2SVinicius Costa Gomes 		return k;
177475d262c2SVinicius Costa Gomes 	}
177575d262c2SVinicius Costa Gomes 
177675d262c2SVinicius Costa Gomes 	return NULL;
177775d262c2SVinicius Costa Gomes }
177875d262c2SVinicius Costa Gomes 
1779c9839a11SVinicius Costa Gomes struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
1780c9839a11SVinicius Costa Gomes 				     u8 addr_type)
178175d262c2SVinicius Costa Gomes {
1782c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
178375d262c2SVinicius Costa Gomes 
1784c9839a11SVinicius Costa Gomes 	list_for_each_entry(k, &hdev->long_term_keys, list)
1785c9839a11SVinicius Costa Gomes 		if (addr_type == k->bdaddr_type &&
1786c9839a11SVinicius Costa Gomes 		    bacmp(bdaddr, &k->bdaddr) == 0)
178775d262c2SVinicius Costa Gomes 			return k;
178875d262c2SVinicius Costa Gomes 
178975d262c2SVinicius Costa Gomes 	return NULL;
179075d262c2SVinicius Costa Gomes }
179175d262c2SVinicius Costa Gomes 
1792d25e28abSJohan Hedberg int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
1793d25e28abSJohan Hedberg 		     bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len)
179455ed8ca1SJohan Hedberg {
179555ed8ca1SJohan Hedberg 	struct link_key *key, *old_key;
1796745c0ce3SVishal Agarwal 	u8 old_key_type;
1797745c0ce3SVishal Agarwal 	bool persistent;
179855ed8ca1SJohan Hedberg 
179955ed8ca1SJohan Hedberg 	old_key = hci_find_link_key(hdev, bdaddr);
180055ed8ca1SJohan Hedberg 	if (old_key) {
180155ed8ca1SJohan Hedberg 		old_key_type = old_key->type;
180255ed8ca1SJohan Hedberg 		key = old_key;
180355ed8ca1SJohan Hedberg 	} else {
180412adcf3aSJohan Hedberg 		old_key_type = conn ? conn->key_type : 0xff;
180555ed8ca1SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_ATOMIC);
180655ed8ca1SJohan Hedberg 		if (!key)
180755ed8ca1SJohan Hedberg 			return -ENOMEM;
180855ed8ca1SJohan Hedberg 		list_add(&key->list, &hdev->link_keys);
180955ed8ca1SJohan Hedberg 	}
181055ed8ca1SJohan Hedberg 
18116ed93dc6SAndrei Emeltchenko 	BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type);
181255ed8ca1SJohan Hedberg 
1813d25e28abSJohan Hedberg 	/* Some buggy controller combinations generate a changed
1814d25e28abSJohan Hedberg 	 * combination key for legacy pairing even when there's no
1815d25e28abSJohan Hedberg 	 * previous key */
1816d25e28abSJohan Hedberg 	if (type == HCI_LK_CHANGED_COMBINATION &&
1817a8c5fb1aSGustavo Padovan 	    (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) {
1818d25e28abSJohan Hedberg 		type = HCI_LK_COMBINATION;
1819655fe6ecSJohan Hedberg 		if (conn)
1820655fe6ecSJohan Hedberg 			conn->key_type = type;
1821655fe6ecSJohan Hedberg 	}
1822d25e28abSJohan Hedberg 
182355ed8ca1SJohan Hedberg 	bacpy(&key->bdaddr, bdaddr);
18249b3b4460SAndrei Emeltchenko 	memcpy(key->val, val, HCI_LINK_KEY_SIZE);
182555ed8ca1SJohan Hedberg 	key->pin_len = pin_len;
182655ed8ca1SJohan Hedberg 
1827b6020ba0SWaldemar Rymarkiewicz 	if (type == HCI_LK_CHANGED_COMBINATION)
182855ed8ca1SJohan Hedberg 		key->type = old_key_type;
18294748fed2SJohan Hedberg 	else
18304748fed2SJohan Hedberg 		key->type = type;
18314748fed2SJohan Hedberg 
18324df378a1SJohan Hedberg 	if (!new_key)
18334df378a1SJohan Hedberg 		return 0;
18344df378a1SJohan Hedberg 
18354df378a1SJohan Hedberg 	persistent = hci_persistent_key(hdev, conn, type, old_key_type);
18364df378a1SJohan Hedberg 
1837744cf19eSJohan Hedberg 	mgmt_new_link_key(hdev, key, persistent);
18384df378a1SJohan Hedberg 
18396ec5bcadSVishal Agarwal 	if (conn)
18406ec5bcadSVishal Agarwal 		conn->flush_key = !persistent;
184155ed8ca1SJohan Hedberg 
184255ed8ca1SJohan Hedberg 	return 0;
184355ed8ca1SJohan Hedberg }
184455ed8ca1SJohan Hedberg 
1845c9839a11SVinicius Costa Gomes int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
18469a006657SAndrei Emeltchenko 		int new_key, u8 authenticated, u8 tk[16], u8 enc_size, __le16
184704124681SGustavo F. Padovan 		ediv, u8 rand[8])
184875d262c2SVinicius Costa Gomes {
1849c9839a11SVinicius Costa Gomes 	struct smp_ltk *key, *old_key;
185075d262c2SVinicius Costa Gomes 
1851c9839a11SVinicius Costa Gomes 	if (!(type & HCI_SMP_STK) && !(type & HCI_SMP_LTK))
1852c9839a11SVinicius Costa Gomes 		return 0;
185375d262c2SVinicius Costa Gomes 
1854c9839a11SVinicius Costa Gomes 	old_key = hci_find_ltk_by_addr(hdev, bdaddr, addr_type);
1855c9839a11SVinicius Costa Gomes 	if (old_key)
185675d262c2SVinicius Costa Gomes 		key = old_key;
1857c9839a11SVinicius Costa Gomes 	else {
1858c9839a11SVinicius Costa Gomes 		key = kzalloc(sizeof(*key), GFP_ATOMIC);
185975d262c2SVinicius Costa Gomes 		if (!key)
186075d262c2SVinicius Costa Gomes 			return -ENOMEM;
1861c9839a11SVinicius Costa Gomes 		list_add(&key->list, &hdev->long_term_keys);
186275d262c2SVinicius Costa Gomes 	}
186375d262c2SVinicius Costa Gomes 
186475d262c2SVinicius Costa Gomes 	bacpy(&key->bdaddr, bdaddr);
1865c9839a11SVinicius Costa Gomes 	key->bdaddr_type = addr_type;
1866c9839a11SVinicius Costa Gomes 	memcpy(key->val, tk, sizeof(key->val));
1867c9839a11SVinicius Costa Gomes 	key->authenticated = authenticated;
1868c9839a11SVinicius Costa Gomes 	key->ediv = ediv;
1869c9839a11SVinicius Costa Gomes 	key->enc_size = enc_size;
1870c9839a11SVinicius Costa Gomes 	key->type = type;
1871c9839a11SVinicius Costa Gomes 	memcpy(key->rand, rand, sizeof(key->rand));
187275d262c2SVinicius Costa Gomes 
1873c9839a11SVinicius Costa Gomes 	if (!new_key)
1874c9839a11SVinicius Costa Gomes 		return 0;
187575d262c2SVinicius Costa Gomes 
1876261cc5aaSVinicius Costa Gomes 	if (type & HCI_SMP_LTK)
1877261cc5aaSVinicius Costa Gomes 		mgmt_new_ltk(hdev, key, 1);
1878261cc5aaSVinicius Costa Gomes 
187975d262c2SVinicius Costa Gomes 	return 0;
188075d262c2SVinicius Costa Gomes }
188175d262c2SVinicius Costa Gomes 
188255ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
188355ed8ca1SJohan Hedberg {
188455ed8ca1SJohan Hedberg 	struct link_key *key;
188555ed8ca1SJohan Hedberg 
188655ed8ca1SJohan Hedberg 	key = hci_find_link_key(hdev, bdaddr);
188755ed8ca1SJohan Hedberg 	if (!key)
188855ed8ca1SJohan Hedberg 		return -ENOENT;
188955ed8ca1SJohan Hedberg 
18906ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
189155ed8ca1SJohan Hedberg 
189255ed8ca1SJohan Hedberg 	list_del(&key->list);
189355ed8ca1SJohan Hedberg 	kfree(key);
189455ed8ca1SJohan Hedberg 
189555ed8ca1SJohan Hedberg 	return 0;
189655ed8ca1SJohan Hedberg }
189755ed8ca1SJohan Hedberg 
1898b899efafSVinicius Costa Gomes int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr)
1899b899efafSVinicius Costa Gomes {
1900b899efafSVinicius Costa Gomes 	struct smp_ltk *k, *tmp;
1901b899efafSVinicius Costa Gomes 
1902b899efafSVinicius Costa Gomes 	list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
1903b899efafSVinicius Costa Gomes 		if (bacmp(bdaddr, &k->bdaddr))
1904b899efafSVinicius Costa Gomes 			continue;
1905b899efafSVinicius Costa Gomes 
19066ed93dc6SAndrei Emeltchenko 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
1907b899efafSVinicius Costa Gomes 
1908b899efafSVinicius Costa Gomes 		list_del(&k->list);
1909b899efafSVinicius Costa Gomes 		kfree(k);
1910b899efafSVinicius Costa Gomes 	}
1911b899efafSVinicius Costa Gomes 
1912b899efafSVinicius Costa Gomes 	return 0;
1913b899efafSVinicius Costa Gomes }
1914b899efafSVinicius Costa Gomes 
19156bd32326SVille Tervo /* HCI command timer function */
1916bda4f23aSAndrei Emeltchenko static void hci_cmd_timeout(unsigned long arg)
19176bd32326SVille Tervo {
19186bd32326SVille Tervo 	struct hci_dev *hdev = (void *) arg;
19196bd32326SVille Tervo 
1920bda4f23aSAndrei Emeltchenko 	if (hdev->sent_cmd) {
1921bda4f23aSAndrei Emeltchenko 		struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data;
1922bda4f23aSAndrei Emeltchenko 		u16 opcode = __le16_to_cpu(sent->opcode);
1923bda4f23aSAndrei Emeltchenko 
1924bda4f23aSAndrei Emeltchenko 		BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode);
1925bda4f23aSAndrei Emeltchenko 	} else {
19266bd32326SVille Tervo 		BT_ERR("%s command tx timeout", hdev->name);
1927bda4f23aSAndrei Emeltchenko 	}
1928bda4f23aSAndrei Emeltchenko 
19296bd32326SVille Tervo 	atomic_set(&hdev->cmd_cnt, 1);
1930c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
19316bd32326SVille Tervo }
19326bd32326SVille Tervo 
19332763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
19342763eda6SSzymon Janc 					  bdaddr_t *bdaddr)
19352763eda6SSzymon Janc {
19362763eda6SSzymon Janc 	struct oob_data *data;
19372763eda6SSzymon Janc 
19382763eda6SSzymon Janc 	list_for_each_entry(data, &hdev->remote_oob_data, list)
19392763eda6SSzymon Janc 		if (bacmp(bdaddr, &data->bdaddr) == 0)
19402763eda6SSzymon Janc 			return data;
19412763eda6SSzymon Janc 
19422763eda6SSzymon Janc 	return NULL;
19432763eda6SSzymon Janc }
19442763eda6SSzymon Janc 
19452763eda6SSzymon Janc int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr)
19462763eda6SSzymon Janc {
19472763eda6SSzymon Janc 	struct oob_data *data;
19482763eda6SSzymon Janc 
19492763eda6SSzymon Janc 	data = hci_find_remote_oob_data(hdev, bdaddr);
19502763eda6SSzymon Janc 	if (!data)
19512763eda6SSzymon Janc 		return -ENOENT;
19522763eda6SSzymon Janc 
19536ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
19542763eda6SSzymon Janc 
19552763eda6SSzymon Janc 	list_del(&data->list);
19562763eda6SSzymon Janc 	kfree(data);
19572763eda6SSzymon Janc 
19582763eda6SSzymon Janc 	return 0;
19592763eda6SSzymon Janc }
19602763eda6SSzymon Janc 
19612763eda6SSzymon Janc int hci_remote_oob_data_clear(struct hci_dev *hdev)
19622763eda6SSzymon Janc {
19632763eda6SSzymon Janc 	struct oob_data *data, *n;
19642763eda6SSzymon Janc 
19652763eda6SSzymon Janc 	list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) {
19662763eda6SSzymon Janc 		list_del(&data->list);
19672763eda6SSzymon Janc 		kfree(data);
19682763eda6SSzymon Janc 	}
19692763eda6SSzymon Janc 
19702763eda6SSzymon Janc 	return 0;
19712763eda6SSzymon Janc }
19722763eda6SSzymon Janc 
19732763eda6SSzymon Janc int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
19742763eda6SSzymon Janc 			    u8 *randomizer)
19752763eda6SSzymon Janc {
19762763eda6SSzymon Janc 	struct oob_data *data;
19772763eda6SSzymon Janc 
19782763eda6SSzymon Janc 	data = hci_find_remote_oob_data(hdev, bdaddr);
19792763eda6SSzymon Janc 
19802763eda6SSzymon Janc 	if (!data) {
19812763eda6SSzymon Janc 		data = kmalloc(sizeof(*data), GFP_ATOMIC);
19822763eda6SSzymon Janc 		if (!data)
19832763eda6SSzymon Janc 			return -ENOMEM;
19842763eda6SSzymon Janc 
19852763eda6SSzymon Janc 		bacpy(&data->bdaddr, bdaddr);
19862763eda6SSzymon Janc 		list_add(&data->list, &hdev->remote_oob_data);
19872763eda6SSzymon Janc 	}
19882763eda6SSzymon Janc 
19892763eda6SSzymon Janc 	memcpy(data->hash, hash, sizeof(data->hash));
19902763eda6SSzymon Janc 	memcpy(data->randomizer, randomizer, sizeof(data->randomizer));
19912763eda6SSzymon Janc 
19926ed93dc6SAndrei Emeltchenko 	BT_DBG("%s for %pMR", hdev->name, bdaddr);
19932763eda6SSzymon Janc 
19942763eda6SSzymon Janc 	return 0;
19952763eda6SSzymon Janc }
19962763eda6SSzymon Janc 
199704124681SGustavo F. Padovan struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr)
1998b2a66aadSAntti Julku {
1999b2a66aadSAntti Julku 	struct bdaddr_list *b;
2000b2a66aadSAntti Julku 
20018035ded4SLuiz Augusto von Dentz 	list_for_each_entry(b, &hdev->blacklist, list)
2002b2a66aadSAntti Julku 		if (bacmp(bdaddr, &b->bdaddr) == 0)
2003b2a66aadSAntti Julku 			return b;
2004b2a66aadSAntti Julku 
2005b2a66aadSAntti Julku 	return NULL;
2006b2a66aadSAntti Julku }
2007b2a66aadSAntti Julku 
2008b2a66aadSAntti Julku int hci_blacklist_clear(struct hci_dev *hdev)
2009b2a66aadSAntti Julku {
2010b2a66aadSAntti Julku 	struct list_head *p, *n;
2011b2a66aadSAntti Julku 
2012b2a66aadSAntti Julku 	list_for_each_safe(p, n, &hdev->blacklist) {
2013b2a66aadSAntti Julku 		struct bdaddr_list *b;
2014b2a66aadSAntti Julku 
2015b2a66aadSAntti Julku 		b = list_entry(p, struct bdaddr_list, list);
2016b2a66aadSAntti Julku 
2017b2a66aadSAntti Julku 		list_del(p);
2018b2a66aadSAntti Julku 		kfree(b);
2019b2a66aadSAntti Julku 	}
2020b2a66aadSAntti Julku 
2021b2a66aadSAntti Julku 	return 0;
2022b2a66aadSAntti Julku }
2023b2a66aadSAntti Julku 
202488c1fe4bSJohan Hedberg int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
2025b2a66aadSAntti Julku {
2026b2a66aadSAntti Julku 	struct bdaddr_list *entry;
2027b2a66aadSAntti Julku 
2028b2a66aadSAntti Julku 	if (bacmp(bdaddr, BDADDR_ANY) == 0)
2029b2a66aadSAntti Julku 		return -EBADF;
2030b2a66aadSAntti Julku 
20315e762444SAntti Julku 	if (hci_blacklist_lookup(hdev, bdaddr))
20325e762444SAntti Julku 		return -EEXIST;
2033b2a66aadSAntti Julku 
2034b2a66aadSAntti Julku 	entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
20355e762444SAntti Julku 	if (!entry)
20365e762444SAntti Julku 		return -ENOMEM;
2037b2a66aadSAntti Julku 
2038b2a66aadSAntti Julku 	bacpy(&entry->bdaddr, bdaddr);
2039b2a66aadSAntti Julku 
2040b2a66aadSAntti Julku 	list_add(&entry->list, &hdev->blacklist);
2041b2a66aadSAntti Julku 
204288c1fe4bSJohan Hedberg 	return mgmt_device_blocked(hdev, bdaddr, type);
2043b2a66aadSAntti Julku }
2044b2a66aadSAntti Julku 
204588c1fe4bSJohan Hedberg int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
2046b2a66aadSAntti Julku {
2047b2a66aadSAntti Julku 	struct bdaddr_list *entry;
2048b2a66aadSAntti Julku 
20491ec918ceSSzymon Janc 	if (bacmp(bdaddr, BDADDR_ANY) == 0)
20505e762444SAntti Julku 		return hci_blacklist_clear(hdev);
2051b2a66aadSAntti Julku 
2052b2a66aadSAntti Julku 	entry = hci_blacklist_lookup(hdev, bdaddr);
20531ec918ceSSzymon Janc 	if (!entry)
20545e762444SAntti Julku 		return -ENOENT;
2055b2a66aadSAntti Julku 
2056b2a66aadSAntti Julku 	list_del(&entry->list);
2057b2a66aadSAntti Julku 	kfree(entry);
2058b2a66aadSAntti Julku 
205988c1fe4bSJohan Hedberg 	return mgmt_device_unblocked(hdev, bdaddr, type);
2060b2a66aadSAntti Julku }
2061b2a66aadSAntti Julku 
20624c87eaabSAndre Guedes static void inquiry_complete(struct hci_dev *hdev, u8 status)
20637ba8b4beSAndre Guedes {
20644c87eaabSAndre Guedes 	if (status) {
20654c87eaabSAndre Guedes 		BT_ERR("Failed to start inquiry: status %d", status);
20667ba8b4beSAndre Guedes 
20674c87eaabSAndre Guedes 		hci_dev_lock(hdev);
20684c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
20694c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
20704c87eaabSAndre Guedes 		return;
20714c87eaabSAndre Guedes 	}
20727ba8b4beSAndre Guedes }
20737ba8b4beSAndre Guedes 
20744c87eaabSAndre Guedes static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status)
20757ba8b4beSAndre Guedes {
20764c87eaabSAndre Guedes 	/* General inquiry access code (GIAC) */
20774c87eaabSAndre Guedes 	u8 lap[3] = { 0x33, 0x8b, 0x9e };
20784c87eaabSAndre Guedes 	struct hci_request req;
20794c87eaabSAndre Guedes 	struct hci_cp_inquiry cp;
20807ba8b4beSAndre Guedes 	int err;
20817ba8b4beSAndre Guedes 
20824c87eaabSAndre Guedes 	if (status) {
20834c87eaabSAndre Guedes 		BT_ERR("Failed to disable LE scanning: status %d", status);
20844c87eaabSAndre Guedes 		return;
20857ba8b4beSAndre Guedes 	}
20867ba8b4beSAndre Guedes 
20874c87eaabSAndre Guedes 	switch (hdev->discovery.type) {
20884c87eaabSAndre Guedes 	case DISCOV_TYPE_LE:
20894c87eaabSAndre Guedes 		hci_dev_lock(hdev);
20904c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
20914c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
20924c87eaabSAndre Guedes 		break;
20937dbfac1dSAndre Guedes 
20944c87eaabSAndre Guedes 	case DISCOV_TYPE_INTERLEAVED:
20954c87eaabSAndre Guedes 		hci_req_init(&req, hdev);
20967dbfac1dSAndre Guedes 
20977dbfac1dSAndre Guedes 		memset(&cp, 0, sizeof(cp));
20984c87eaabSAndre Guedes 		memcpy(&cp.lap, lap, sizeof(cp.lap));
20994c87eaabSAndre Guedes 		cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN;
21004c87eaabSAndre Guedes 		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp);
21014c87eaabSAndre Guedes 
21024c87eaabSAndre Guedes 		hci_dev_lock(hdev);
21034c87eaabSAndre Guedes 
21044c87eaabSAndre Guedes 		hci_inquiry_cache_flush(hdev);
21054c87eaabSAndre Guedes 
21064c87eaabSAndre Guedes 		err = hci_req_run(&req, inquiry_complete);
21074c87eaabSAndre Guedes 		if (err) {
21084c87eaabSAndre Guedes 			BT_ERR("Inquiry request failed: err %d", err);
21094c87eaabSAndre Guedes 			hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
21107dbfac1dSAndre Guedes 		}
21117dbfac1dSAndre Guedes 
21124c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
21134c87eaabSAndre Guedes 		break;
21144c87eaabSAndre Guedes 	}
21157dbfac1dSAndre Guedes }
21167dbfac1dSAndre Guedes 
21177ba8b4beSAndre Guedes static void le_scan_disable_work(struct work_struct *work)
21187ba8b4beSAndre Guedes {
21197ba8b4beSAndre Guedes 	struct hci_dev *hdev = container_of(work, struct hci_dev,
21207ba8b4beSAndre Guedes 					    le_scan_disable.work);
21217ba8b4beSAndre Guedes 	struct hci_cp_le_set_scan_enable cp;
21224c87eaabSAndre Guedes 	struct hci_request req;
21234c87eaabSAndre Guedes 	int err;
21247ba8b4beSAndre Guedes 
21257ba8b4beSAndre Guedes 	BT_DBG("%s", hdev->name);
21267ba8b4beSAndre Guedes 
21274c87eaabSAndre Guedes 	hci_req_init(&req, hdev);
21287ba8b4beSAndre Guedes 
21297ba8b4beSAndre Guedes 	memset(&cp, 0, sizeof(cp));
21304c87eaabSAndre Guedes 	cp.enable = LE_SCAN_DISABLE;
21314c87eaabSAndre Guedes 	hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
21327ba8b4beSAndre Guedes 
21334c87eaabSAndre Guedes 	err = hci_req_run(&req, le_scan_disable_work_complete);
21344c87eaabSAndre Guedes 	if (err)
21354c87eaabSAndre Guedes 		BT_ERR("Disable LE scanning request failed: err %d", err);
213628b75a89SAndre Guedes }
213728b75a89SAndre Guedes 
21389be0dab7SDavid Herrmann /* Alloc HCI device */
21399be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void)
21409be0dab7SDavid Herrmann {
21419be0dab7SDavid Herrmann 	struct hci_dev *hdev;
21429be0dab7SDavid Herrmann 
21439be0dab7SDavid Herrmann 	hdev = kzalloc(sizeof(struct hci_dev), GFP_KERNEL);
21449be0dab7SDavid Herrmann 	if (!hdev)
21459be0dab7SDavid Herrmann 		return NULL;
21469be0dab7SDavid Herrmann 
2147b1b813d4SDavid Herrmann 	hdev->pkt_type  = (HCI_DM1 | HCI_DH1 | HCI_HV1);
2148b1b813d4SDavid Herrmann 	hdev->esco_type = (ESCO_HV1);
2149b1b813d4SDavid Herrmann 	hdev->link_mode = (HCI_LM_ACCEPT);
2150b1b813d4SDavid Herrmann 	hdev->io_capability = 0x03; /* No Input No Output */
2151bbaf444aSJohan Hedberg 	hdev->inq_tx_power = HCI_TX_POWER_INVALID;
2152bbaf444aSJohan Hedberg 	hdev->adv_tx_power = HCI_TX_POWER_INVALID;
2153b1b813d4SDavid Herrmann 
2154b1b813d4SDavid Herrmann 	hdev->sniff_max_interval = 800;
2155b1b813d4SDavid Herrmann 	hdev->sniff_min_interval = 80;
2156b1b813d4SDavid Herrmann 
2157b1b813d4SDavid Herrmann 	mutex_init(&hdev->lock);
2158b1b813d4SDavid Herrmann 	mutex_init(&hdev->req_lock);
2159b1b813d4SDavid Herrmann 
2160b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->mgmt_pending);
2161b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->blacklist);
2162b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->uuids);
2163b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->link_keys);
2164b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->long_term_keys);
2165b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->remote_oob_data);
21666b536b5eSAndrei Emeltchenko 	INIT_LIST_HEAD(&hdev->conn_hash.list);
2167b1b813d4SDavid Herrmann 
2168b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->rx_work, hci_rx_work);
2169b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->cmd_work, hci_cmd_work);
2170b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->tx_work, hci_tx_work);
2171b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->power_on, hci_power_on);
2172b1b813d4SDavid Herrmann 
2173b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
2174b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off);
2175b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
2176b1b813d4SDavid Herrmann 
2177b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->rx_q);
2178b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->cmd_q);
2179b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->raw_q);
2180b1b813d4SDavid Herrmann 
2181b1b813d4SDavid Herrmann 	init_waitqueue_head(&hdev->req_wait_q);
2182b1b813d4SDavid Herrmann 
2183bda4f23aSAndrei Emeltchenko 	setup_timer(&hdev->cmd_timer, hci_cmd_timeout, (unsigned long) hdev);
2184b1b813d4SDavid Herrmann 
2185b1b813d4SDavid Herrmann 	hci_init_sysfs(hdev);
2186b1b813d4SDavid Herrmann 	discovery_init(hdev);
21879be0dab7SDavid Herrmann 
21889be0dab7SDavid Herrmann 	return hdev;
21899be0dab7SDavid Herrmann }
21909be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev);
21919be0dab7SDavid Herrmann 
21929be0dab7SDavid Herrmann /* Free HCI device */
21939be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev)
21949be0dab7SDavid Herrmann {
21959be0dab7SDavid Herrmann 	/* will free via device release */
21969be0dab7SDavid Herrmann 	put_device(&hdev->dev);
21979be0dab7SDavid Herrmann }
21989be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev);
21999be0dab7SDavid Herrmann 
22001da177e4SLinus Torvalds /* Register HCI device */
22011da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev)
22021da177e4SLinus Torvalds {
2203b1b813d4SDavid Herrmann 	int id, error;
22041da177e4SLinus Torvalds 
2205010666a1SDavid Herrmann 	if (!hdev->open || !hdev->close)
22061da177e4SLinus Torvalds 		return -EINVAL;
22071da177e4SLinus Torvalds 
220808add513SMat Martineau 	/* Do not allow HCI_AMP devices to register at index 0,
220908add513SMat Martineau 	 * so the index can be used as the AMP controller ID.
221008add513SMat Martineau 	 */
22113df92b31SSasha Levin 	switch (hdev->dev_type) {
22123df92b31SSasha Levin 	case HCI_BREDR:
22133df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL);
22141da177e4SLinus Torvalds 		break;
22153df92b31SSasha Levin 	case HCI_AMP:
22163df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL);
22173df92b31SSasha Levin 		break;
22183df92b31SSasha Levin 	default:
22193df92b31SSasha Levin 		return -EINVAL;
22201da177e4SLinus Torvalds 	}
22211da177e4SLinus Torvalds 
22223df92b31SSasha Levin 	if (id < 0)
22233df92b31SSasha Levin 		return id;
22243df92b31SSasha Levin 
22251da177e4SLinus Torvalds 	sprintf(hdev->name, "hci%d", id);
22261da177e4SLinus Torvalds 	hdev->id = id;
22272d8b3a11SAndrei Emeltchenko 
22282d8b3a11SAndrei Emeltchenko 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
22292d8b3a11SAndrei Emeltchenko 
2230d8537548SKees Cook 	hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
2231d8537548SKees Cook 					  WQ_MEM_RECLAIM, 1, hdev->name);
223233ca954dSDavid Herrmann 	if (!hdev->workqueue) {
223333ca954dSDavid Herrmann 		error = -ENOMEM;
223433ca954dSDavid Herrmann 		goto err;
223533ca954dSDavid Herrmann 	}
2236f48fd9c8SMarcel Holtmann 
2237d8537548SKees Cook 	hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
2238d8537548SKees Cook 					      WQ_MEM_RECLAIM, 1, hdev->name);
22396ead1bbcSJohan Hedberg 	if (!hdev->req_workqueue) {
22406ead1bbcSJohan Hedberg 		destroy_workqueue(hdev->workqueue);
22416ead1bbcSJohan Hedberg 		error = -ENOMEM;
22426ead1bbcSJohan Hedberg 		goto err;
22436ead1bbcSJohan Hedberg 	}
22446ead1bbcSJohan Hedberg 
224533ca954dSDavid Herrmann 	error = hci_add_sysfs(hdev);
224633ca954dSDavid Herrmann 	if (error < 0)
224733ca954dSDavid Herrmann 		goto err_wqueue;
22481da177e4SLinus Torvalds 
2249611b30f7SMarcel Holtmann 	hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev,
2250a8c5fb1aSGustavo Padovan 				    RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops,
2251a8c5fb1aSGustavo Padovan 				    hdev);
2252611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
2253611b30f7SMarcel Holtmann 		if (rfkill_register(hdev->rfkill) < 0) {
2254611b30f7SMarcel Holtmann 			rfkill_destroy(hdev->rfkill);
2255611b30f7SMarcel Holtmann 			hdev->rfkill = NULL;
2256611b30f7SMarcel Holtmann 		}
2257611b30f7SMarcel Holtmann 	}
2258611b30f7SMarcel Holtmann 
2259a8b2d5c2SJohan Hedberg 	set_bit(HCI_SETUP, &hdev->dev_flags);
2260ce2be9acSAndrei Emeltchenko 
2261ce2be9acSAndrei Emeltchenko 	if (hdev->dev_type != HCI_AMP)
2262ce2be9acSAndrei Emeltchenko 		set_bit(HCI_AUTO_OFF, &hdev->dev_flags);
2263ce2be9acSAndrei Emeltchenko 
2264fcee3377SGustavo Padovan 	write_lock(&hci_dev_list_lock);
2265fcee3377SGustavo Padovan 	list_add(&hdev->list, &hci_dev_list);
2266fcee3377SGustavo Padovan 	write_unlock(&hci_dev_list_lock);
2267fcee3377SGustavo Padovan 
22681da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_REG);
2269dc946bd8SDavid Herrmann 	hci_dev_hold(hdev);
22701da177e4SLinus Torvalds 
227119202573SJohan Hedberg 	queue_work(hdev->req_workqueue, &hdev->power_on);
2272fbe96d6fSMarcel Holtmann 
22731da177e4SLinus Torvalds 	return id;
2274f48fd9c8SMarcel Holtmann 
227533ca954dSDavid Herrmann err_wqueue:
227633ca954dSDavid Herrmann 	destroy_workqueue(hdev->workqueue);
22776ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
227833ca954dSDavid Herrmann err:
22793df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, hdev->id);
2280f48fd9c8SMarcel Holtmann 
228133ca954dSDavid Herrmann 	return error;
22821da177e4SLinus Torvalds }
22831da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev);
22841da177e4SLinus Torvalds 
22851da177e4SLinus Torvalds /* Unregister HCI device */
228659735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev)
22871da177e4SLinus Torvalds {
22883df92b31SSasha Levin 	int i, id;
2289ef222013SMarcel Holtmann 
2290c13854ceSMarcel Holtmann 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
22911da177e4SLinus Torvalds 
229294324962SJohan Hovold 	set_bit(HCI_UNREGISTER, &hdev->dev_flags);
229394324962SJohan Hovold 
22943df92b31SSasha Levin 	id = hdev->id;
22953df92b31SSasha Levin 
2296f20d09d5SGustavo F. Padovan 	write_lock(&hci_dev_list_lock);
22971da177e4SLinus Torvalds 	list_del(&hdev->list);
2298f20d09d5SGustavo F. Padovan 	write_unlock(&hci_dev_list_lock);
22991da177e4SLinus Torvalds 
23001da177e4SLinus Torvalds 	hci_dev_do_close(hdev);
23011da177e4SLinus Torvalds 
2302cd4c5391SSuraj Sumangala 	for (i = 0; i < NUM_REASSEMBLY; i++)
2303ef222013SMarcel Holtmann 		kfree_skb(hdev->reassembly[i]);
2304ef222013SMarcel Holtmann 
2305b9b5ef18SGustavo Padovan 	cancel_work_sync(&hdev->power_on);
2306b9b5ef18SGustavo Padovan 
2307ab81cbf9SJohan Hedberg 	if (!test_bit(HCI_INIT, &hdev->flags) &&
2308a8b2d5c2SJohan Hedberg 	    !test_bit(HCI_SETUP, &hdev->dev_flags)) {
230909fd0de5SGustavo F. Padovan 		hci_dev_lock(hdev);
2310744cf19eSJohan Hedberg 		mgmt_index_removed(hdev);
231109fd0de5SGustavo F. Padovan 		hci_dev_unlock(hdev);
231256e5cb86SJohan Hedberg 	}
2313ab81cbf9SJohan Hedberg 
23142e58ef3eSJohan Hedberg 	/* mgmt_index_removed should take care of emptying the
23152e58ef3eSJohan Hedberg 	 * pending list */
23162e58ef3eSJohan Hedberg 	BUG_ON(!list_empty(&hdev->mgmt_pending));
23172e58ef3eSJohan Hedberg 
23181da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_UNREG);
23191da177e4SLinus Torvalds 
2320611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
2321611b30f7SMarcel Holtmann 		rfkill_unregister(hdev->rfkill);
2322611b30f7SMarcel Holtmann 		rfkill_destroy(hdev->rfkill);
2323611b30f7SMarcel Holtmann 	}
2324611b30f7SMarcel Holtmann 
2325ce242970SDavid Herrmann 	hci_del_sysfs(hdev);
2326147e2d59SDave Young 
2327f48fd9c8SMarcel Holtmann 	destroy_workqueue(hdev->workqueue);
23286ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
2329f48fd9c8SMarcel Holtmann 
233009fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
2331e2e0cacbSJohan Hedberg 	hci_blacklist_clear(hdev);
23322aeb9a1aSJohan Hedberg 	hci_uuids_clear(hdev);
233355ed8ca1SJohan Hedberg 	hci_link_keys_clear(hdev);
2334b899efafSVinicius Costa Gomes 	hci_smp_ltks_clear(hdev);
23352763eda6SSzymon Janc 	hci_remote_oob_data_clear(hdev);
233609fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
2337e2e0cacbSJohan Hedberg 
2338dc946bd8SDavid Herrmann 	hci_dev_put(hdev);
23393df92b31SSasha Levin 
23403df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, id);
23411da177e4SLinus Torvalds }
23421da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev);
23431da177e4SLinus Torvalds 
23441da177e4SLinus Torvalds /* Suspend HCI device */
23451da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev)
23461da177e4SLinus Torvalds {
23471da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_SUSPEND);
23481da177e4SLinus Torvalds 	return 0;
23491da177e4SLinus Torvalds }
23501da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev);
23511da177e4SLinus Torvalds 
23521da177e4SLinus Torvalds /* Resume HCI device */
23531da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev)
23541da177e4SLinus Torvalds {
23551da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_RESUME);
23561da177e4SLinus Torvalds 	return 0;
23571da177e4SLinus Torvalds }
23581da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev);
23591da177e4SLinus Torvalds 
236076bca880SMarcel Holtmann /* Receive frame from HCI drivers */
236176bca880SMarcel Holtmann int hci_recv_frame(struct sk_buff *skb)
236276bca880SMarcel Holtmann {
236376bca880SMarcel Holtmann 	struct hci_dev *hdev = (struct hci_dev *) skb->dev;
236476bca880SMarcel Holtmann 	if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
236576bca880SMarcel Holtmann 		      && !test_bit(HCI_INIT, &hdev->flags))) {
236676bca880SMarcel Holtmann 		kfree_skb(skb);
236776bca880SMarcel Holtmann 		return -ENXIO;
236876bca880SMarcel Holtmann 	}
236976bca880SMarcel Holtmann 
2370d82603c6SJorrit Schippers 	/* Incoming skb */
237176bca880SMarcel Holtmann 	bt_cb(skb)->incoming = 1;
237276bca880SMarcel Holtmann 
237376bca880SMarcel Holtmann 	/* Time stamp */
237476bca880SMarcel Holtmann 	__net_timestamp(skb);
237576bca880SMarcel Holtmann 
237676bca880SMarcel Holtmann 	skb_queue_tail(&hdev->rx_q, skb);
2377b78752ccSMarcel Holtmann 	queue_work(hdev->workqueue, &hdev->rx_work);
2378c78ae283SMarcel Holtmann 
237976bca880SMarcel Holtmann 	return 0;
238076bca880SMarcel Holtmann }
238176bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame);
238276bca880SMarcel Holtmann 
238333e882a5SSuraj Sumangala static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
23841e429f38SGustavo F. Padovan 			  int count, __u8 index)
238533e882a5SSuraj Sumangala {
238633e882a5SSuraj Sumangala 	int len = 0;
238733e882a5SSuraj Sumangala 	int hlen = 0;
238833e882a5SSuraj Sumangala 	int remain = count;
238933e882a5SSuraj Sumangala 	struct sk_buff *skb;
239033e882a5SSuraj Sumangala 	struct bt_skb_cb *scb;
239133e882a5SSuraj Sumangala 
239233e882a5SSuraj Sumangala 	if ((type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT) ||
239333e882a5SSuraj Sumangala 	    index >= NUM_REASSEMBLY)
239433e882a5SSuraj Sumangala 		return -EILSEQ;
239533e882a5SSuraj Sumangala 
239633e882a5SSuraj Sumangala 	skb = hdev->reassembly[index];
239733e882a5SSuraj Sumangala 
239833e882a5SSuraj Sumangala 	if (!skb) {
239933e882a5SSuraj Sumangala 		switch (type) {
240033e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
240133e882a5SSuraj Sumangala 			len = HCI_MAX_FRAME_SIZE;
240233e882a5SSuraj Sumangala 			hlen = HCI_ACL_HDR_SIZE;
240333e882a5SSuraj Sumangala 			break;
240433e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
240533e882a5SSuraj Sumangala 			len = HCI_MAX_EVENT_SIZE;
240633e882a5SSuraj Sumangala 			hlen = HCI_EVENT_HDR_SIZE;
240733e882a5SSuraj Sumangala 			break;
240833e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
240933e882a5SSuraj Sumangala 			len = HCI_MAX_SCO_SIZE;
241033e882a5SSuraj Sumangala 			hlen = HCI_SCO_HDR_SIZE;
241133e882a5SSuraj Sumangala 			break;
241233e882a5SSuraj Sumangala 		}
241333e882a5SSuraj Sumangala 
24141e429f38SGustavo F. Padovan 		skb = bt_skb_alloc(len, GFP_ATOMIC);
241533e882a5SSuraj Sumangala 		if (!skb)
241633e882a5SSuraj Sumangala 			return -ENOMEM;
241733e882a5SSuraj Sumangala 
241833e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
241933e882a5SSuraj Sumangala 		scb->expect = hlen;
242033e882a5SSuraj Sumangala 		scb->pkt_type = type;
242133e882a5SSuraj Sumangala 
242233e882a5SSuraj Sumangala 		skb->dev = (void *) hdev;
242333e882a5SSuraj Sumangala 		hdev->reassembly[index] = skb;
242433e882a5SSuraj Sumangala 	}
242533e882a5SSuraj Sumangala 
242633e882a5SSuraj Sumangala 	while (count) {
242733e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
242889bb46d0SDan Carpenter 		len = min_t(uint, scb->expect, count);
242933e882a5SSuraj Sumangala 
243033e882a5SSuraj Sumangala 		memcpy(skb_put(skb, len), data, len);
243133e882a5SSuraj Sumangala 
243233e882a5SSuraj Sumangala 		count -= len;
243333e882a5SSuraj Sumangala 		data += len;
243433e882a5SSuraj Sumangala 		scb->expect -= len;
243533e882a5SSuraj Sumangala 		remain = count;
243633e882a5SSuraj Sumangala 
243733e882a5SSuraj Sumangala 		switch (type) {
243833e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
243933e882a5SSuraj Sumangala 			if (skb->len == HCI_EVENT_HDR_SIZE) {
244033e882a5SSuraj Sumangala 				struct hci_event_hdr *h = hci_event_hdr(skb);
244133e882a5SSuraj Sumangala 				scb->expect = h->plen;
244233e882a5SSuraj Sumangala 
244333e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
244433e882a5SSuraj Sumangala 					kfree_skb(skb);
244533e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
244633e882a5SSuraj Sumangala 					return -ENOMEM;
244733e882a5SSuraj Sumangala 				}
244833e882a5SSuraj Sumangala 			}
244933e882a5SSuraj Sumangala 			break;
245033e882a5SSuraj Sumangala 
245133e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
245233e882a5SSuraj Sumangala 			if (skb->len  == HCI_ACL_HDR_SIZE) {
245333e882a5SSuraj Sumangala 				struct hci_acl_hdr *h = hci_acl_hdr(skb);
245433e882a5SSuraj Sumangala 				scb->expect = __le16_to_cpu(h->dlen);
245533e882a5SSuraj Sumangala 
245633e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
245733e882a5SSuraj Sumangala 					kfree_skb(skb);
245833e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
245933e882a5SSuraj Sumangala 					return -ENOMEM;
246033e882a5SSuraj Sumangala 				}
246133e882a5SSuraj Sumangala 			}
246233e882a5SSuraj Sumangala 			break;
246333e882a5SSuraj Sumangala 
246433e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
246533e882a5SSuraj Sumangala 			if (skb->len == HCI_SCO_HDR_SIZE) {
246633e882a5SSuraj Sumangala 				struct hci_sco_hdr *h = hci_sco_hdr(skb);
246733e882a5SSuraj Sumangala 				scb->expect = h->dlen;
246833e882a5SSuraj Sumangala 
246933e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
247033e882a5SSuraj Sumangala 					kfree_skb(skb);
247133e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
247233e882a5SSuraj Sumangala 					return -ENOMEM;
247333e882a5SSuraj Sumangala 				}
247433e882a5SSuraj Sumangala 			}
247533e882a5SSuraj Sumangala 			break;
247633e882a5SSuraj Sumangala 		}
247733e882a5SSuraj Sumangala 
247833e882a5SSuraj Sumangala 		if (scb->expect == 0) {
247933e882a5SSuraj Sumangala 			/* Complete frame */
248033e882a5SSuraj Sumangala 
248133e882a5SSuraj Sumangala 			bt_cb(skb)->pkt_type = type;
248233e882a5SSuraj Sumangala 			hci_recv_frame(skb);
248333e882a5SSuraj Sumangala 
248433e882a5SSuraj Sumangala 			hdev->reassembly[index] = NULL;
248533e882a5SSuraj Sumangala 			return remain;
248633e882a5SSuraj Sumangala 		}
248733e882a5SSuraj Sumangala 	}
248833e882a5SSuraj Sumangala 
248933e882a5SSuraj Sumangala 	return remain;
249033e882a5SSuraj Sumangala }
249133e882a5SSuraj Sumangala 
2492ef222013SMarcel Holtmann int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
2493ef222013SMarcel Holtmann {
2494f39a3c06SSuraj Sumangala 	int rem = 0;
2495f39a3c06SSuraj Sumangala 
2496ef222013SMarcel Holtmann 	if (type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT)
2497ef222013SMarcel Holtmann 		return -EILSEQ;
2498ef222013SMarcel Holtmann 
2499da5f6c37SGustavo F. Padovan 	while (count) {
25001e429f38SGustavo F. Padovan 		rem = hci_reassembly(hdev, type, data, count, type - 1);
2501f39a3c06SSuraj Sumangala 		if (rem < 0)
2502f39a3c06SSuraj Sumangala 			return rem;
2503ef222013SMarcel Holtmann 
2504f39a3c06SSuraj Sumangala 		data += (count - rem);
2505f39a3c06SSuraj Sumangala 		count = rem;
2506f81c6224SJoe Perches 	}
2507ef222013SMarcel Holtmann 
2508f39a3c06SSuraj Sumangala 	return rem;
2509ef222013SMarcel Holtmann }
2510ef222013SMarcel Holtmann EXPORT_SYMBOL(hci_recv_fragment);
2511ef222013SMarcel Holtmann 
251299811510SSuraj Sumangala #define STREAM_REASSEMBLY 0
251399811510SSuraj Sumangala 
251499811510SSuraj Sumangala int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count)
251599811510SSuraj Sumangala {
251699811510SSuraj Sumangala 	int type;
251799811510SSuraj Sumangala 	int rem = 0;
251899811510SSuraj Sumangala 
2519da5f6c37SGustavo F. Padovan 	while (count) {
252099811510SSuraj Sumangala 		struct sk_buff *skb = hdev->reassembly[STREAM_REASSEMBLY];
252199811510SSuraj Sumangala 
252299811510SSuraj Sumangala 		if (!skb) {
252399811510SSuraj Sumangala 			struct { char type; } *pkt;
252499811510SSuraj Sumangala 
252599811510SSuraj Sumangala 			/* Start of the frame */
252699811510SSuraj Sumangala 			pkt = data;
252799811510SSuraj Sumangala 			type = pkt->type;
252899811510SSuraj Sumangala 
252999811510SSuraj Sumangala 			data++;
253099811510SSuraj Sumangala 			count--;
253199811510SSuraj Sumangala 		} else
253299811510SSuraj Sumangala 			type = bt_cb(skb)->pkt_type;
253399811510SSuraj Sumangala 
25341e429f38SGustavo F. Padovan 		rem = hci_reassembly(hdev, type, data, count,
25351e429f38SGustavo F. Padovan 				     STREAM_REASSEMBLY);
253699811510SSuraj Sumangala 		if (rem < 0)
253799811510SSuraj Sumangala 			return rem;
253899811510SSuraj Sumangala 
253999811510SSuraj Sumangala 		data += (count - rem);
254099811510SSuraj Sumangala 		count = rem;
2541f81c6224SJoe Perches 	}
254299811510SSuraj Sumangala 
254399811510SSuraj Sumangala 	return rem;
254499811510SSuraj Sumangala }
254599811510SSuraj Sumangala EXPORT_SYMBOL(hci_recv_stream_fragment);
254699811510SSuraj Sumangala 
25471da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */
25481da177e4SLinus Torvalds 
25491da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb)
25501da177e4SLinus Torvalds {
25511da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
25521da177e4SLinus Torvalds 
2553f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
25541da177e4SLinus Torvalds 	list_add(&cb->list, &hci_cb_list);
2555f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
25561da177e4SLinus Torvalds 
25571da177e4SLinus Torvalds 	return 0;
25581da177e4SLinus Torvalds }
25591da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb);
25601da177e4SLinus Torvalds 
25611da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb)
25621da177e4SLinus Torvalds {
25631da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
25641da177e4SLinus Torvalds 
2565f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
25661da177e4SLinus Torvalds 	list_del(&cb->list);
2567f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
25681da177e4SLinus Torvalds 
25691da177e4SLinus Torvalds 	return 0;
25701da177e4SLinus Torvalds }
25711da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb);
25721da177e4SLinus Torvalds 
25731da177e4SLinus Torvalds static int hci_send_frame(struct sk_buff *skb)
25741da177e4SLinus Torvalds {
25751da177e4SLinus Torvalds 	struct hci_dev *hdev = (struct hci_dev *) skb->dev;
25761da177e4SLinus Torvalds 
25771da177e4SLinus Torvalds 	if (!hdev) {
25781da177e4SLinus Torvalds 		kfree_skb(skb);
25791da177e4SLinus Torvalds 		return -ENODEV;
25801da177e4SLinus Torvalds 	}
25811da177e4SLinus Torvalds 
25820d48d939SMarcel Holtmann 	BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
25831da177e4SLinus Torvalds 
25841da177e4SLinus Torvalds 	/* Time stamp */
2585a61bbcf2SPatrick McHardy 	__net_timestamp(skb);
25861da177e4SLinus Torvalds 
2587cd82e61cSMarcel Holtmann 	/* Send copy to monitor */
2588cd82e61cSMarcel Holtmann 	hci_send_to_monitor(hdev, skb);
2589cd82e61cSMarcel Holtmann 
2590cd82e61cSMarcel Holtmann 	if (atomic_read(&hdev->promisc)) {
2591cd82e61cSMarcel Holtmann 		/* Send copy to the sockets */
2592470fe1b5SMarcel Holtmann 		hci_send_to_sock(hdev, skb);
25931da177e4SLinus Torvalds 	}
25941da177e4SLinus Torvalds 
25951da177e4SLinus Torvalds 	/* Get rid of skb owner, prior to sending to the driver. */
25961da177e4SLinus Torvalds 	skb_orphan(skb);
25971da177e4SLinus Torvalds 
25981da177e4SLinus Torvalds 	return hdev->send(skb);
25991da177e4SLinus Torvalds }
26001da177e4SLinus Torvalds 
26013119ae95SJohan Hedberg void hci_req_init(struct hci_request *req, struct hci_dev *hdev)
26023119ae95SJohan Hedberg {
26033119ae95SJohan Hedberg 	skb_queue_head_init(&req->cmd_q);
26043119ae95SJohan Hedberg 	req->hdev = hdev;
26055d73e034SAndre Guedes 	req->err = 0;
26063119ae95SJohan Hedberg }
26073119ae95SJohan Hedberg 
26083119ae95SJohan Hedberg int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
26093119ae95SJohan Hedberg {
26103119ae95SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
26113119ae95SJohan Hedberg 	struct sk_buff *skb;
26123119ae95SJohan Hedberg 	unsigned long flags;
26133119ae95SJohan Hedberg 
26143119ae95SJohan Hedberg 	BT_DBG("length %u", skb_queue_len(&req->cmd_q));
26153119ae95SJohan Hedberg 
26165d73e034SAndre Guedes 	/* If an error occured during request building, remove all HCI
26175d73e034SAndre Guedes 	 * commands queued on the HCI request queue.
26185d73e034SAndre Guedes 	 */
26195d73e034SAndre Guedes 	if (req->err) {
26205d73e034SAndre Guedes 		skb_queue_purge(&req->cmd_q);
26215d73e034SAndre Guedes 		return req->err;
26225d73e034SAndre Guedes 	}
26235d73e034SAndre Guedes 
26243119ae95SJohan Hedberg 	/* Do not allow empty requests */
26253119ae95SJohan Hedberg 	if (skb_queue_empty(&req->cmd_q))
2626382b0c39SAndre Guedes 		return -ENODATA;
26273119ae95SJohan Hedberg 
26283119ae95SJohan Hedberg 	skb = skb_peek_tail(&req->cmd_q);
26293119ae95SJohan Hedberg 	bt_cb(skb)->req.complete = complete;
26303119ae95SJohan Hedberg 
26313119ae95SJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
26323119ae95SJohan Hedberg 	skb_queue_splice_tail(&req->cmd_q, &hdev->cmd_q);
26333119ae95SJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
26343119ae95SJohan Hedberg 
26353119ae95SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
26363119ae95SJohan Hedberg 
26373119ae95SJohan Hedberg 	return 0;
26383119ae95SJohan Hedberg }
26393119ae95SJohan Hedberg 
26401ca3a9d0SJohan Hedberg static struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode,
264107dc93ddSJohan Hedberg 				       u32 plen, const void *param)
26421da177e4SLinus Torvalds {
26431da177e4SLinus Torvalds 	int len = HCI_COMMAND_HDR_SIZE + plen;
26441da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
26451da177e4SLinus Torvalds 	struct sk_buff *skb;
26461da177e4SLinus Torvalds 
26471da177e4SLinus Torvalds 	skb = bt_skb_alloc(len, GFP_ATOMIC);
26481ca3a9d0SJohan Hedberg 	if (!skb)
26491ca3a9d0SJohan Hedberg 		return NULL;
26501da177e4SLinus Torvalds 
26511da177e4SLinus Torvalds 	hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE);
2652a9de9248SMarcel Holtmann 	hdr->opcode = cpu_to_le16(opcode);
26531da177e4SLinus Torvalds 	hdr->plen   = plen;
26541da177e4SLinus Torvalds 
26551da177e4SLinus Torvalds 	if (plen)
26561da177e4SLinus Torvalds 		memcpy(skb_put(skb, plen), param, plen);
26571da177e4SLinus Torvalds 
26581da177e4SLinus Torvalds 	BT_DBG("skb len %d", skb->len);
26591da177e4SLinus Torvalds 
26600d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
26611da177e4SLinus Torvalds 	skb->dev = (void *) hdev;
2662c78ae283SMarcel Holtmann 
26631ca3a9d0SJohan Hedberg 	return skb;
26641ca3a9d0SJohan Hedberg }
26651ca3a9d0SJohan Hedberg 
26661ca3a9d0SJohan Hedberg /* Send HCI command */
266707dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
266807dc93ddSJohan Hedberg 		 const void *param)
26691ca3a9d0SJohan Hedberg {
26701ca3a9d0SJohan Hedberg 	struct sk_buff *skb;
26711ca3a9d0SJohan Hedberg 
26721ca3a9d0SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
26731ca3a9d0SJohan Hedberg 
26741ca3a9d0SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
26751ca3a9d0SJohan Hedberg 	if (!skb) {
26761ca3a9d0SJohan Hedberg 		BT_ERR("%s no memory for command", hdev->name);
26771ca3a9d0SJohan Hedberg 		return -ENOMEM;
26781ca3a9d0SJohan Hedberg 	}
26791ca3a9d0SJohan Hedberg 
268011714b3dSJohan Hedberg 	/* Stand-alone HCI commands must be flaged as
268111714b3dSJohan Hedberg 	 * single-command requests.
268211714b3dSJohan Hedberg 	 */
268311714b3dSJohan Hedberg 	bt_cb(skb)->req.start = true;
268411714b3dSJohan Hedberg 
26851da177e4SLinus Torvalds 	skb_queue_tail(&hdev->cmd_q, skb);
2686c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
26871da177e4SLinus Torvalds 
26881da177e4SLinus Torvalds 	return 0;
26891da177e4SLinus Torvalds }
26901da177e4SLinus Torvalds 
269171c76a17SJohan Hedberg /* Queue a command to an asynchronous HCI request */
269207dc93ddSJohan Hedberg void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
269307dc93ddSJohan Hedberg 		    const void *param, u8 event)
269471c76a17SJohan Hedberg {
269571c76a17SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
269671c76a17SJohan Hedberg 	struct sk_buff *skb;
269771c76a17SJohan Hedberg 
269871c76a17SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
269971c76a17SJohan Hedberg 
270034739c1eSAndre Guedes 	/* If an error occured during request building, there is no point in
270134739c1eSAndre Guedes 	 * queueing the HCI command. We can simply return.
270234739c1eSAndre Guedes 	 */
270334739c1eSAndre Guedes 	if (req->err)
270434739c1eSAndre Guedes 		return;
270534739c1eSAndre Guedes 
270671c76a17SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
270771c76a17SJohan Hedberg 	if (!skb) {
27085d73e034SAndre Guedes 		BT_ERR("%s no memory for command (opcode 0x%4.4x)",
27095d73e034SAndre Guedes 		       hdev->name, opcode);
27105d73e034SAndre Guedes 		req->err = -ENOMEM;
2711e348fe6bSAndre Guedes 		return;
271271c76a17SJohan Hedberg 	}
271371c76a17SJohan Hedberg 
271471c76a17SJohan Hedberg 	if (skb_queue_empty(&req->cmd_q))
271571c76a17SJohan Hedberg 		bt_cb(skb)->req.start = true;
271671c76a17SJohan Hedberg 
271702350a72SJohan Hedberg 	bt_cb(skb)->req.event = event;
271802350a72SJohan Hedberg 
271971c76a17SJohan Hedberg 	skb_queue_tail(&req->cmd_q, skb);
272071c76a17SJohan Hedberg }
272171c76a17SJohan Hedberg 
272207dc93ddSJohan Hedberg void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
272307dc93ddSJohan Hedberg 		 const void *param)
272402350a72SJohan Hedberg {
272502350a72SJohan Hedberg 	hci_req_add_ev(req, opcode, plen, param, 0);
272602350a72SJohan Hedberg }
272702350a72SJohan Hedberg 
27281da177e4SLinus Torvalds /* Get data from the previously sent command */
2729a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
27301da177e4SLinus Torvalds {
27311da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
27321da177e4SLinus Torvalds 
27331da177e4SLinus Torvalds 	if (!hdev->sent_cmd)
27341da177e4SLinus Torvalds 		return NULL;
27351da177e4SLinus Torvalds 
27361da177e4SLinus Torvalds 	hdr = (void *) hdev->sent_cmd->data;
27371da177e4SLinus Torvalds 
2738a9de9248SMarcel Holtmann 	if (hdr->opcode != cpu_to_le16(opcode))
27391da177e4SLinus Torvalds 		return NULL;
27401da177e4SLinus Torvalds 
2741f0e09510SAndrei Emeltchenko 	BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
27421da177e4SLinus Torvalds 
27431da177e4SLinus Torvalds 	return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
27441da177e4SLinus Torvalds }
27451da177e4SLinus Torvalds 
27461da177e4SLinus Torvalds /* Send ACL data */
27471da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags)
27481da177e4SLinus Torvalds {
27491da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr;
27501da177e4SLinus Torvalds 	int len = skb->len;
27511da177e4SLinus Torvalds 
2752badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_ACL_HDR_SIZE);
2753badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
27549c70220bSArnaldo Carvalho de Melo 	hdr = (struct hci_acl_hdr *)skb_transport_header(skb);
2755aca3192cSYOSHIFUJI Hideaki 	hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags));
2756aca3192cSYOSHIFUJI Hideaki 	hdr->dlen   = cpu_to_le16(len);
27571da177e4SLinus Torvalds }
27581da177e4SLinus Torvalds 
2759ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
276073d80debSLuiz Augusto von Dentz 			  struct sk_buff *skb, __u16 flags)
27611da177e4SLinus Torvalds {
2762ee22be7eSAndrei Emeltchenko 	struct hci_conn *conn = chan->conn;
27631da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
27641da177e4SLinus Torvalds 	struct sk_buff *list;
27651da177e4SLinus Torvalds 
2766087bfd99SGustavo Padovan 	skb->len = skb_headlen(skb);
2767087bfd99SGustavo Padovan 	skb->data_len = 0;
2768087bfd99SGustavo Padovan 
2769087bfd99SGustavo Padovan 	bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
2770204a6e54SAndrei Emeltchenko 
2771204a6e54SAndrei Emeltchenko 	switch (hdev->dev_type) {
2772204a6e54SAndrei Emeltchenko 	case HCI_BREDR:
2773087bfd99SGustavo Padovan 		hci_add_acl_hdr(skb, conn->handle, flags);
2774204a6e54SAndrei Emeltchenko 		break;
2775204a6e54SAndrei Emeltchenko 	case HCI_AMP:
2776204a6e54SAndrei Emeltchenko 		hci_add_acl_hdr(skb, chan->handle, flags);
2777204a6e54SAndrei Emeltchenko 		break;
2778204a6e54SAndrei Emeltchenko 	default:
2779204a6e54SAndrei Emeltchenko 		BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
2780204a6e54SAndrei Emeltchenko 		return;
2781204a6e54SAndrei Emeltchenko 	}
2782087bfd99SGustavo Padovan 
278370f23020SAndrei Emeltchenko 	list = skb_shinfo(skb)->frag_list;
278470f23020SAndrei Emeltchenko 	if (!list) {
27851da177e4SLinus Torvalds 		/* Non fragmented */
27861da177e4SLinus Torvalds 		BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len);
27871da177e4SLinus Torvalds 
278873d80debSLuiz Augusto von Dentz 		skb_queue_tail(queue, skb);
27891da177e4SLinus Torvalds 	} else {
27901da177e4SLinus Torvalds 		/* Fragmented */
27911da177e4SLinus Torvalds 		BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
27921da177e4SLinus Torvalds 
27931da177e4SLinus Torvalds 		skb_shinfo(skb)->frag_list = NULL;
27941da177e4SLinus Torvalds 
27951da177e4SLinus Torvalds 		/* Queue all fragments atomically */
2796af3e6359SGustavo F. Padovan 		spin_lock(&queue->lock);
27971da177e4SLinus Torvalds 
279873d80debSLuiz Augusto von Dentz 		__skb_queue_tail(queue, skb);
2799e702112fSAndrei Emeltchenko 
2800e702112fSAndrei Emeltchenko 		flags &= ~ACL_START;
2801e702112fSAndrei Emeltchenko 		flags |= ACL_CONT;
28021da177e4SLinus Torvalds 		do {
28031da177e4SLinus Torvalds 			skb = list; list = list->next;
28041da177e4SLinus Torvalds 
28051da177e4SLinus Torvalds 			skb->dev = (void *) hdev;
28060d48d939SMarcel Holtmann 			bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
2807e702112fSAndrei Emeltchenko 			hci_add_acl_hdr(skb, conn->handle, flags);
28081da177e4SLinus Torvalds 
28091da177e4SLinus Torvalds 			BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
28101da177e4SLinus Torvalds 
281173d80debSLuiz Augusto von Dentz 			__skb_queue_tail(queue, skb);
28121da177e4SLinus Torvalds 		} while (list);
28131da177e4SLinus Torvalds 
2814af3e6359SGustavo F. Padovan 		spin_unlock(&queue->lock);
28151da177e4SLinus Torvalds 	}
281673d80debSLuiz Augusto von Dentz }
281773d80debSLuiz Augusto von Dentz 
281873d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
281973d80debSLuiz Augusto von Dentz {
2820ee22be7eSAndrei Emeltchenko 	struct hci_dev *hdev = chan->conn->hdev;
282173d80debSLuiz Augusto von Dentz 
2822f0e09510SAndrei Emeltchenko 	BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags);
282373d80debSLuiz Augusto von Dentz 
282473d80debSLuiz Augusto von Dentz 	skb->dev = (void *) hdev;
282573d80debSLuiz Augusto von Dentz 
2826ee22be7eSAndrei Emeltchenko 	hci_queue_acl(chan, &chan->data_q, skb, flags);
28271da177e4SLinus Torvalds 
28283eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
28291da177e4SLinus Torvalds }
28301da177e4SLinus Torvalds 
28311da177e4SLinus Torvalds /* Send SCO data */
28320d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
28331da177e4SLinus Torvalds {
28341da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
28351da177e4SLinus Torvalds 	struct hci_sco_hdr hdr;
28361da177e4SLinus Torvalds 
28371da177e4SLinus Torvalds 	BT_DBG("%s len %d", hdev->name, skb->len);
28381da177e4SLinus Torvalds 
2839aca3192cSYOSHIFUJI Hideaki 	hdr.handle = cpu_to_le16(conn->handle);
28401da177e4SLinus Torvalds 	hdr.dlen   = skb->len;
28411da177e4SLinus Torvalds 
2842badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_SCO_HDR_SIZE);
2843badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
28449c70220bSArnaldo Carvalho de Melo 	memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE);
28451da177e4SLinus Torvalds 
28461da177e4SLinus Torvalds 	skb->dev = (void *) hdev;
28470d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_SCODATA_PKT;
2848c78ae283SMarcel Holtmann 
28491da177e4SLinus Torvalds 	skb_queue_tail(&conn->data_q, skb);
28503eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
28511da177e4SLinus Torvalds }
28521da177e4SLinus Torvalds 
28531da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */
28541da177e4SLinus Torvalds 
28551da177e4SLinus Torvalds /* HCI Connection scheduler */
28566039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
2857a8c5fb1aSGustavo Padovan 				     int *quote)
28581da177e4SLinus Torvalds {
28591da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
28608035ded4SLuiz Augusto von Dentz 	struct hci_conn *conn = NULL, *c;
2861abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0;
28621da177e4SLinus Torvalds 
28631da177e4SLinus Torvalds 	/* We don't have to lock device here. Connections are always
28641da177e4SLinus Torvalds 	 * added and removed with TX task disabled. */
2865bf4c6325SGustavo F. Padovan 
2866bf4c6325SGustavo F. Padovan 	rcu_read_lock();
2867bf4c6325SGustavo F. Padovan 
2868bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
2869769be974SMarcel Holtmann 		if (c->type != type || skb_queue_empty(&c->data_q))
28701da177e4SLinus Torvalds 			continue;
2871769be974SMarcel Holtmann 
2872769be974SMarcel Holtmann 		if (c->state != BT_CONNECTED && c->state != BT_CONFIG)
2873769be974SMarcel Holtmann 			continue;
2874769be974SMarcel Holtmann 
28751da177e4SLinus Torvalds 		num++;
28761da177e4SLinus Torvalds 
28771da177e4SLinus Torvalds 		if (c->sent < min) {
28781da177e4SLinus Torvalds 			min  = c->sent;
28791da177e4SLinus Torvalds 			conn = c;
28801da177e4SLinus Torvalds 		}
288152087a79SLuiz Augusto von Dentz 
288252087a79SLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
288352087a79SLuiz Augusto von Dentz 			break;
28841da177e4SLinus Torvalds 	}
28851da177e4SLinus Torvalds 
2886bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
2887bf4c6325SGustavo F. Padovan 
28881da177e4SLinus Torvalds 	if (conn) {
28896ed58ec5SVille Tervo 		int cnt, q;
28906ed58ec5SVille Tervo 
28916ed58ec5SVille Tervo 		switch (conn->type) {
28926ed58ec5SVille Tervo 		case ACL_LINK:
28936ed58ec5SVille Tervo 			cnt = hdev->acl_cnt;
28946ed58ec5SVille Tervo 			break;
28956ed58ec5SVille Tervo 		case SCO_LINK:
28966ed58ec5SVille Tervo 		case ESCO_LINK:
28976ed58ec5SVille Tervo 			cnt = hdev->sco_cnt;
28986ed58ec5SVille Tervo 			break;
28996ed58ec5SVille Tervo 		case LE_LINK:
29006ed58ec5SVille Tervo 			cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
29016ed58ec5SVille Tervo 			break;
29026ed58ec5SVille Tervo 		default:
29036ed58ec5SVille Tervo 			cnt = 0;
29046ed58ec5SVille Tervo 			BT_ERR("Unknown link type");
29056ed58ec5SVille Tervo 		}
29066ed58ec5SVille Tervo 
29076ed58ec5SVille Tervo 		q = cnt / num;
29081da177e4SLinus Torvalds 		*quote = q ? q : 1;
29091da177e4SLinus Torvalds 	} else
29101da177e4SLinus Torvalds 		*quote = 0;
29111da177e4SLinus Torvalds 
29121da177e4SLinus Torvalds 	BT_DBG("conn %p quote %d", conn, *quote);
29131da177e4SLinus Torvalds 	return conn;
29141da177e4SLinus Torvalds }
29151da177e4SLinus Torvalds 
29166039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
29171da177e4SLinus Torvalds {
29181da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
29191da177e4SLinus Torvalds 	struct hci_conn *c;
29201da177e4SLinus Torvalds 
2921bae1f5d9SVille Tervo 	BT_ERR("%s link tx timeout", hdev->name);
29221da177e4SLinus Torvalds 
2923bf4c6325SGustavo F. Padovan 	rcu_read_lock();
2924bf4c6325SGustavo F. Padovan 
29251da177e4SLinus Torvalds 	/* Kill stalled connections */
2926bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
2927bae1f5d9SVille Tervo 		if (c->type == type && c->sent) {
29286ed93dc6SAndrei Emeltchenko 			BT_ERR("%s killing stalled connection %pMR",
29296ed93dc6SAndrei Emeltchenko 			       hdev->name, &c->dst);
2930bed71748SAndre Guedes 			hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
29311da177e4SLinus Torvalds 		}
29321da177e4SLinus Torvalds 	}
2933bf4c6325SGustavo F. Padovan 
2934bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
29351da177e4SLinus Torvalds }
29361da177e4SLinus Torvalds 
29376039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
293873d80debSLuiz Augusto von Dentz 				      int *quote)
293973d80debSLuiz Augusto von Dentz {
294073d80debSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
294173d80debSLuiz Augusto von Dentz 	struct hci_chan *chan = NULL;
2942abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0, cur_prio = 0;
294373d80debSLuiz Augusto von Dentz 	struct hci_conn *conn;
294473d80debSLuiz Augusto von Dentz 	int cnt, q, conn_num = 0;
294573d80debSLuiz Augusto von Dentz 
294673d80debSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
294773d80debSLuiz Augusto von Dentz 
2948bf4c6325SGustavo F. Padovan 	rcu_read_lock();
2949bf4c6325SGustavo F. Padovan 
2950bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
295173d80debSLuiz Augusto von Dentz 		struct hci_chan *tmp;
295273d80debSLuiz Augusto von Dentz 
295373d80debSLuiz Augusto von Dentz 		if (conn->type != type)
295473d80debSLuiz Augusto von Dentz 			continue;
295573d80debSLuiz Augusto von Dentz 
295673d80debSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
295773d80debSLuiz Augusto von Dentz 			continue;
295873d80debSLuiz Augusto von Dentz 
295973d80debSLuiz Augusto von Dentz 		conn_num++;
296073d80debSLuiz Augusto von Dentz 
29618192edefSGustavo F. Padovan 		list_for_each_entry_rcu(tmp, &conn->chan_list, list) {
296273d80debSLuiz Augusto von Dentz 			struct sk_buff *skb;
296373d80debSLuiz Augusto von Dentz 
296473d80debSLuiz Augusto von Dentz 			if (skb_queue_empty(&tmp->data_q))
296573d80debSLuiz Augusto von Dentz 				continue;
296673d80debSLuiz Augusto von Dentz 
296773d80debSLuiz Augusto von Dentz 			skb = skb_peek(&tmp->data_q);
296873d80debSLuiz Augusto von Dentz 			if (skb->priority < cur_prio)
296973d80debSLuiz Augusto von Dentz 				continue;
297073d80debSLuiz Augusto von Dentz 
297173d80debSLuiz Augusto von Dentz 			if (skb->priority > cur_prio) {
297273d80debSLuiz Augusto von Dentz 				num = 0;
297373d80debSLuiz Augusto von Dentz 				min = ~0;
297473d80debSLuiz Augusto von Dentz 				cur_prio = skb->priority;
297573d80debSLuiz Augusto von Dentz 			}
297673d80debSLuiz Augusto von Dentz 
297773d80debSLuiz Augusto von Dentz 			num++;
297873d80debSLuiz Augusto von Dentz 
297973d80debSLuiz Augusto von Dentz 			if (conn->sent < min) {
298073d80debSLuiz Augusto von Dentz 				min  = conn->sent;
298173d80debSLuiz Augusto von Dentz 				chan = tmp;
298273d80debSLuiz Augusto von Dentz 			}
298373d80debSLuiz Augusto von Dentz 		}
298473d80debSLuiz Augusto von Dentz 
298573d80debSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == conn_num)
298673d80debSLuiz Augusto von Dentz 			break;
298773d80debSLuiz Augusto von Dentz 	}
298873d80debSLuiz Augusto von Dentz 
2989bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
2990bf4c6325SGustavo F. Padovan 
299173d80debSLuiz Augusto von Dentz 	if (!chan)
299273d80debSLuiz Augusto von Dentz 		return NULL;
299373d80debSLuiz Augusto von Dentz 
299473d80debSLuiz Augusto von Dentz 	switch (chan->conn->type) {
299573d80debSLuiz Augusto von Dentz 	case ACL_LINK:
299673d80debSLuiz Augusto von Dentz 		cnt = hdev->acl_cnt;
299773d80debSLuiz Augusto von Dentz 		break;
2998bd1eb66bSAndrei Emeltchenko 	case AMP_LINK:
2999bd1eb66bSAndrei Emeltchenko 		cnt = hdev->block_cnt;
3000bd1eb66bSAndrei Emeltchenko 		break;
300173d80debSLuiz Augusto von Dentz 	case SCO_LINK:
300273d80debSLuiz Augusto von Dentz 	case ESCO_LINK:
300373d80debSLuiz Augusto von Dentz 		cnt = hdev->sco_cnt;
300473d80debSLuiz Augusto von Dentz 		break;
300573d80debSLuiz Augusto von Dentz 	case LE_LINK:
300673d80debSLuiz Augusto von Dentz 		cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
300773d80debSLuiz Augusto von Dentz 		break;
300873d80debSLuiz Augusto von Dentz 	default:
300973d80debSLuiz Augusto von Dentz 		cnt = 0;
301073d80debSLuiz Augusto von Dentz 		BT_ERR("Unknown link type");
301173d80debSLuiz Augusto von Dentz 	}
301273d80debSLuiz Augusto von Dentz 
301373d80debSLuiz Augusto von Dentz 	q = cnt / num;
301473d80debSLuiz Augusto von Dentz 	*quote = q ? q : 1;
301573d80debSLuiz Augusto von Dentz 	BT_DBG("chan %p quote %d", chan, *quote);
301673d80debSLuiz Augusto von Dentz 	return chan;
301773d80debSLuiz Augusto von Dentz }
301873d80debSLuiz Augusto von Dentz 
301902b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type)
302002b20f0bSLuiz Augusto von Dentz {
302102b20f0bSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
302202b20f0bSLuiz Augusto von Dentz 	struct hci_conn *conn;
302302b20f0bSLuiz Augusto von Dentz 	int num = 0;
302402b20f0bSLuiz Augusto von Dentz 
302502b20f0bSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
302602b20f0bSLuiz Augusto von Dentz 
3027bf4c6325SGustavo F. Padovan 	rcu_read_lock();
3028bf4c6325SGustavo F. Padovan 
3029bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
303002b20f0bSLuiz Augusto von Dentz 		struct hci_chan *chan;
303102b20f0bSLuiz Augusto von Dentz 
303202b20f0bSLuiz Augusto von Dentz 		if (conn->type != type)
303302b20f0bSLuiz Augusto von Dentz 			continue;
303402b20f0bSLuiz Augusto von Dentz 
303502b20f0bSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
303602b20f0bSLuiz Augusto von Dentz 			continue;
303702b20f0bSLuiz Augusto von Dentz 
303802b20f0bSLuiz Augusto von Dentz 		num++;
303902b20f0bSLuiz Augusto von Dentz 
30408192edefSGustavo F. Padovan 		list_for_each_entry_rcu(chan, &conn->chan_list, list) {
304102b20f0bSLuiz Augusto von Dentz 			struct sk_buff *skb;
304202b20f0bSLuiz Augusto von Dentz 
304302b20f0bSLuiz Augusto von Dentz 			if (chan->sent) {
304402b20f0bSLuiz Augusto von Dentz 				chan->sent = 0;
304502b20f0bSLuiz Augusto von Dentz 				continue;
304602b20f0bSLuiz Augusto von Dentz 			}
304702b20f0bSLuiz Augusto von Dentz 
304802b20f0bSLuiz Augusto von Dentz 			if (skb_queue_empty(&chan->data_q))
304902b20f0bSLuiz Augusto von Dentz 				continue;
305002b20f0bSLuiz Augusto von Dentz 
305102b20f0bSLuiz Augusto von Dentz 			skb = skb_peek(&chan->data_q);
305202b20f0bSLuiz Augusto von Dentz 			if (skb->priority >= HCI_PRIO_MAX - 1)
305302b20f0bSLuiz Augusto von Dentz 				continue;
305402b20f0bSLuiz Augusto von Dentz 
305502b20f0bSLuiz Augusto von Dentz 			skb->priority = HCI_PRIO_MAX - 1;
305602b20f0bSLuiz Augusto von Dentz 
305702b20f0bSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p promoted to %d", chan, skb,
305802b20f0bSLuiz Augusto von Dentz 			       skb->priority);
305902b20f0bSLuiz Augusto von Dentz 		}
306002b20f0bSLuiz Augusto von Dentz 
306102b20f0bSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
306202b20f0bSLuiz Augusto von Dentz 			break;
306302b20f0bSLuiz Augusto von Dentz 	}
3064bf4c6325SGustavo F. Padovan 
3065bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
3066bf4c6325SGustavo F. Padovan 
306702b20f0bSLuiz Augusto von Dentz }
306802b20f0bSLuiz Augusto von Dentz 
3069b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb)
3070b71d385aSAndrei Emeltchenko {
3071b71d385aSAndrei Emeltchenko 	/* Calculate count of blocks used by this packet */
3072b71d385aSAndrei Emeltchenko 	return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len);
3073b71d385aSAndrei Emeltchenko }
3074b71d385aSAndrei Emeltchenko 
30756039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt)
30761da177e4SLinus Torvalds {
30771da177e4SLinus Torvalds 	if (!test_bit(HCI_RAW, &hdev->flags)) {
30781da177e4SLinus Torvalds 		/* ACL tx timeout must be longer than maximum
30791da177e4SLinus Torvalds 		 * link supervision timeout (40.9 seconds) */
308063d2bc1bSAndrei Emeltchenko 		if (!cnt && time_after(jiffies, hdev->acl_last_tx +
30815f246e89SAndrei Emeltchenko 				       HCI_ACL_TX_TIMEOUT))
3082bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, ACL_LINK);
30831da177e4SLinus Torvalds 	}
308463d2bc1bSAndrei Emeltchenko }
30851da177e4SLinus Torvalds 
30866039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev)
308763d2bc1bSAndrei Emeltchenko {
308863d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->acl_cnt;
308963d2bc1bSAndrei Emeltchenko 	struct hci_chan *chan;
309063d2bc1bSAndrei Emeltchenko 	struct sk_buff *skb;
309163d2bc1bSAndrei Emeltchenko 	int quote;
309263d2bc1bSAndrei Emeltchenko 
309363d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
309404837f64SMarcel Holtmann 
309573d80debSLuiz Augusto von Dentz 	while (hdev->acl_cnt &&
309673d80debSLuiz Augusto von Dentz 	       (chan = hci_chan_sent(hdev, ACL_LINK, &quote))) {
3097ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
3098ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
309973d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
310073d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
310173d80debSLuiz Augusto von Dentz 
3102ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
3103ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
3104ec1cce24SLuiz Augusto von Dentz 				break;
3105ec1cce24SLuiz Augusto von Dentz 
3106ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
3107ec1cce24SLuiz Augusto von Dentz 
310873d80debSLuiz Augusto von Dentz 			hci_conn_enter_active_mode(chan->conn,
310973d80debSLuiz Augusto von Dentz 						   bt_cb(skb)->force_active);
311004837f64SMarcel Holtmann 
31111da177e4SLinus Torvalds 			hci_send_frame(skb);
31121da177e4SLinus Torvalds 			hdev->acl_last_tx = jiffies;
31131da177e4SLinus Torvalds 
31141da177e4SLinus Torvalds 			hdev->acl_cnt--;
311573d80debSLuiz Augusto von Dentz 			chan->sent++;
311673d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
31171da177e4SLinus Torvalds 		}
31181da177e4SLinus Torvalds 	}
311902b20f0bSLuiz Augusto von Dentz 
312002b20f0bSLuiz Augusto von Dentz 	if (cnt != hdev->acl_cnt)
312102b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, ACL_LINK);
31221da177e4SLinus Torvalds }
31231da177e4SLinus Torvalds 
31246039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev)
3125b71d385aSAndrei Emeltchenko {
312663d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->block_cnt;
3127b71d385aSAndrei Emeltchenko 	struct hci_chan *chan;
3128b71d385aSAndrei Emeltchenko 	struct sk_buff *skb;
3129b71d385aSAndrei Emeltchenko 	int quote;
3130bd1eb66bSAndrei Emeltchenko 	u8 type;
3131b71d385aSAndrei Emeltchenko 
313263d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
3133b71d385aSAndrei Emeltchenko 
3134bd1eb66bSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
3135bd1eb66bSAndrei Emeltchenko 
3136bd1eb66bSAndrei Emeltchenko 	if (hdev->dev_type == HCI_AMP)
3137bd1eb66bSAndrei Emeltchenko 		type = AMP_LINK;
3138bd1eb66bSAndrei Emeltchenko 	else
3139bd1eb66bSAndrei Emeltchenko 		type = ACL_LINK;
3140bd1eb66bSAndrei Emeltchenko 
3141b71d385aSAndrei Emeltchenko 	while (hdev->block_cnt > 0 &&
3142bd1eb66bSAndrei Emeltchenko 	       (chan = hci_chan_sent(hdev, type, &quote))) {
3143b71d385aSAndrei Emeltchenko 		u32 priority = (skb_peek(&chan->data_q))->priority;
3144b71d385aSAndrei Emeltchenko 		while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
3145b71d385aSAndrei Emeltchenko 			int blocks;
3146b71d385aSAndrei Emeltchenko 
3147b71d385aSAndrei Emeltchenko 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
3148b71d385aSAndrei Emeltchenko 			       skb->len, skb->priority);
3149b71d385aSAndrei Emeltchenko 
3150b71d385aSAndrei Emeltchenko 			/* Stop if priority has changed */
3151b71d385aSAndrei Emeltchenko 			if (skb->priority < priority)
3152b71d385aSAndrei Emeltchenko 				break;
3153b71d385aSAndrei Emeltchenko 
3154b71d385aSAndrei Emeltchenko 			skb = skb_dequeue(&chan->data_q);
3155b71d385aSAndrei Emeltchenko 
3156b71d385aSAndrei Emeltchenko 			blocks = __get_blocks(hdev, skb);
3157b71d385aSAndrei Emeltchenko 			if (blocks > hdev->block_cnt)
3158b71d385aSAndrei Emeltchenko 				return;
3159b71d385aSAndrei Emeltchenko 
3160b71d385aSAndrei Emeltchenko 			hci_conn_enter_active_mode(chan->conn,
3161b71d385aSAndrei Emeltchenko 						   bt_cb(skb)->force_active);
3162b71d385aSAndrei Emeltchenko 
3163b71d385aSAndrei Emeltchenko 			hci_send_frame(skb);
3164b71d385aSAndrei Emeltchenko 			hdev->acl_last_tx = jiffies;
3165b71d385aSAndrei Emeltchenko 
3166b71d385aSAndrei Emeltchenko 			hdev->block_cnt -= blocks;
3167b71d385aSAndrei Emeltchenko 			quote -= blocks;
3168b71d385aSAndrei Emeltchenko 
3169b71d385aSAndrei Emeltchenko 			chan->sent += blocks;
3170b71d385aSAndrei Emeltchenko 			chan->conn->sent += blocks;
3171b71d385aSAndrei Emeltchenko 		}
3172b71d385aSAndrei Emeltchenko 	}
3173b71d385aSAndrei Emeltchenko 
3174b71d385aSAndrei Emeltchenko 	if (cnt != hdev->block_cnt)
3175bd1eb66bSAndrei Emeltchenko 		hci_prio_recalculate(hdev, type);
3176b71d385aSAndrei Emeltchenko }
3177b71d385aSAndrei Emeltchenko 
31786039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev)
3179b71d385aSAndrei Emeltchenko {
3180b71d385aSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
3181b71d385aSAndrei Emeltchenko 
3182bd1eb66bSAndrei Emeltchenko 	/* No ACL link over BR/EDR controller */
3183bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR)
3184bd1eb66bSAndrei Emeltchenko 		return;
3185bd1eb66bSAndrei Emeltchenko 
3186bd1eb66bSAndrei Emeltchenko 	/* No AMP link over AMP controller */
3187bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
3188b71d385aSAndrei Emeltchenko 		return;
3189b71d385aSAndrei Emeltchenko 
3190b71d385aSAndrei Emeltchenko 	switch (hdev->flow_ctl_mode) {
3191b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_PACKET_BASED:
3192b71d385aSAndrei Emeltchenko 		hci_sched_acl_pkt(hdev);
3193b71d385aSAndrei Emeltchenko 		break;
3194b71d385aSAndrei Emeltchenko 
3195b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_BLOCK_BASED:
3196b71d385aSAndrei Emeltchenko 		hci_sched_acl_blk(hdev);
3197b71d385aSAndrei Emeltchenko 		break;
3198b71d385aSAndrei Emeltchenko 	}
3199b71d385aSAndrei Emeltchenko }
3200b71d385aSAndrei Emeltchenko 
32011da177e4SLinus Torvalds /* Schedule SCO */
32026039aa73SGustavo Padovan static void hci_sched_sco(struct hci_dev *hdev)
32031da177e4SLinus Torvalds {
32041da177e4SLinus Torvalds 	struct hci_conn *conn;
32051da177e4SLinus Torvalds 	struct sk_buff *skb;
32061da177e4SLinus Torvalds 	int quote;
32071da177e4SLinus Torvalds 
32081da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
32091da177e4SLinus Torvalds 
321052087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, SCO_LINK))
321152087a79SLuiz Augusto von Dentz 		return;
321252087a79SLuiz Augusto von Dentz 
32131da177e4SLinus Torvalds 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, &quote))) {
32141da177e4SLinus Torvalds 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
32151da177e4SLinus Torvalds 			BT_DBG("skb %p len %d", skb, skb->len);
32161da177e4SLinus Torvalds 			hci_send_frame(skb);
32171da177e4SLinus Torvalds 
32181da177e4SLinus Torvalds 			conn->sent++;
32191da177e4SLinus Torvalds 			if (conn->sent == ~0)
32201da177e4SLinus Torvalds 				conn->sent = 0;
32211da177e4SLinus Torvalds 		}
32221da177e4SLinus Torvalds 	}
32231da177e4SLinus Torvalds }
32241da177e4SLinus Torvalds 
32256039aa73SGustavo Padovan static void hci_sched_esco(struct hci_dev *hdev)
3226b6a0dc82SMarcel Holtmann {
3227b6a0dc82SMarcel Holtmann 	struct hci_conn *conn;
3228b6a0dc82SMarcel Holtmann 	struct sk_buff *skb;
3229b6a0dc82SMarcel Holtmann 	int quote;
3230b6a0dc82SMarcel Holtmann 
3231b6a0dc82SMarcel Holtmann 	BT_DBG("%s", hdev->name);
3232b6a0dc82SMarcel Holtmann 
323352087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, ESCO_LINK))
323452087a79SLuiz Augusto von Dentz 		return;
323552087a79SLuiz Augusto von Dentz 
32368fc9ced3SGustavo Padovan 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK,
32378fc9ced3SGustavo Padovan 						     &quote))) {
3238b6a0dc82SMarcel Holtmann 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
3239b6a0dc82SMarcel Holtmann 			BT_DBG("skb %p len %d", skb, skb->len);
3240b6a0dc82SMarcel Holtmann 			hci_send_frame(skb);
3241b6a0dc82SMarcel Holtmann 
3242b6a0dc82SMarcel Holtmann 			conn->sent++;
3243b6a0dc82SMarcel Holtmann 			if (conn->sent == ~0)
3244b6a0dc82SMarcel Holtmann 				conn->sent = 0;
3245b6a0dc82SMarcel Holtmann 		}
3246b6a0dc82SMarcel Holtmann 	}
3247b6a0dc82SMarcel Holtmann }
3248b6a0dc82SMarcel Holtmann 
32496039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev)
32506ed58ec5SVille Tervo {
325173d80debSLuiz Augusto von Dentz 	struct hci_chan *chan;
32526ed58ec5SVille Tervo 	struct sk_buff *skb;
325302b20f0bSLuiz Augusto von Dentz 	int quote, cnt, tmp;
32546ed58ec5SVille Tervo 
32556ed58ec5SVille Tervo 	BT_DBG("%s", hdev->name);
32566ed58ec5SVille Tervo 
325752087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, LE_LINK))
325852087a79SLuiz Augusto von Dentz 		return;
325952087a79SLuiz Augusto von Dentz 
32606ed58ec5SVille Tervo 	if (!test_bit(HCI_RAW, &hdev->flags)) {
32616ed58ec5SVille Tervo 		/* LE tx timeout must be longer than maximum
32626ed58ec5SVille Tervo 		 * link supervision timeout (40.9 seconds) */
3263bae1f5d9SVille Tervo 		if (!hdev->le_cnt && hdev->le_pkts &&
32646ed58ec5SVille Tervo 		    time_after(jiffies, hdev->le_last_tx + HZ * 45))
3265bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, LE_LINK);
32666ed58ec5SVille Tervo 	}
32676ed58ec5SVille Tervo 
32686ed58ec5SVille Tervo 	cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
326902b20f0bSLuiz Augusto von Dentz 	tmp = cnt;
327073d80debSLuiz Augusto von Dentz 	while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, &quote))) {
3271ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
3272ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
327373d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
327473d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
32756ed58ec5SVille Tervo 
3276ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
3277ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
3278ec1cce24SLuiz Augusto von Dentz 				break;
3279ec1cce24SLuiz Augusto von Dentz 
3280ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
3281ec1cce24SLuiz Augusto von Dentz 
32826ed58ec5SVille Tervo 			hci_send_frame(skb);
32836ed58ec5SVille Tervo 			hdev->le_last_tx = jiffies;
32846ed58ec5SVille Tervo 
32856ed58ec5SVille Tervo 			cnt--;
328673d80debSLuiz Augusto von Dentz 			chan->sent++;
328773d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
32886ed58ec5SVille Tervo 		}
32896ed58ec5SVille Tervo 	}
329073d80debSLuiz Augusto von Dentz 
32916ed58ec5SVille Tervo 	if (hdev->le_pkts)
32926ed58ec5SVille Tervo 		hdev->le_cnt = cnt;
32936ed58ec5SVille Tervo 	else
32946ed58ec5SVille Tervo 		hdev->acl_cnt = cnt;
329502b20f0bSLuiz Augusto von Dentz 
329602b20f0bSLuiz Augusto von Dentz 	if (cnt != tmp)
329702b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, LE_LINK);
32986ed58ec5SVille Tervo }
32996ed58ec5SVille Tervo 
33003eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work)
33011da177e4SLinus Torvalds {
33023eff45eaSGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work);
33031da177e4SLinus Torvalds 	struct sk_buff *skb;
33041da177e4SLinus Torvalds 
33056ed58ec5SVille Tervo 	BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt,
33066ed58ec5SVille Tervo 	       hdev->sco_cnt, hdev->le_cnt);
33071da177e4SLinus Torvalds 
330852de599eSMarcel Holtmann 	if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
33091da177e4SLinus Torvalds 		/* Schedule queues and send stuff to HCI driver */
33101da177e4SLinus Torvalds 		hci_sched_acl(hdev);
33111da177e4SLinus Torvalds 		hci_sched_sco(hdev);
3312b6a0dc82SMarcel Holtmann 		hci_sched_esco(hdev);
33136ed58ec5SVille Tervo 		hci_sched_le(hdev);
331452de599eSMarcel Holtmann 	}
33156ed58ec5SVille Tervo 
33161da177e4SLinus Torvalds 	/* Send next queued raw (unknown type) packet */
33171da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->raw_q)))
33181da177e4SLinus Torvalds 		hci_send_frame(skb);
33191da177e4SLinus Torvalds }
33201da177e4SLinus Torvalds 
332125985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */
33221da177e4SLinus Torvalds 
33231da177e4SLinus Torvalds /* ACL data packet */
33246039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
33251da177e4SLinus Torvalds {
33261da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr = (void *) skb->data;
33271da177e4SLinus Torvalds 	struct hci_conn *conn;
33281da177e4SLinus Torvalds 	__u16 handle, flags;
33291da177e4SLinus Torvalds 
33301da177e4SLinus Torvalds 	skb_pull(skb, HCI_ACL_HDR_SIZE);
33311da177e4SLinus Torvalds 
33321da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
33331da177e4SLinus Torvalds 	flags  = hci_flags(handle);
33341da177e4SLinus Torvalds 	handle = hci_handle(handle);
33351da177e4SLinus Torvalds 
3336f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
3337a8c5fb1aSGustavo Padovan 	       handle, flags);
33381da177e4SLinus Torvalds 
33391da177e4SLinus Torvalds 	hdev->stat.acl_rx++;
33401da177e4SLinus Torvalds 
33411da177e4SLinus Torvalds 	hci_dev_lock(hdev);
33421da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
33431da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
33441da177e4SLinus Torvalds 
33451da177e4SLinus Torvalds 	if (conn) {
334665983fc7SMat Martineau 		hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
334704837f64SMarcel Holtmann 
33481da177e4SLinus Torvalds 		/* Send to upper protocol */
3349686ebf28SUlisses Furquim 		l2cap_recv_acldata(conn, skb, flags);
33501da177e4SLinus Torvalds 		return;
33511da177e4SLinus Torvalds 	} else {
33521da177e4SLinus Torvalds 		BT_ERR("%s ACL packet for unknown connection handle %d",
33531da177e4SLinus Torvalds 		       hdev->name, handle);
33541da177e4SLinus Torvalds 	}
33551da177e4SLinus Torvalds 
33561da177e4SLinus Torvalds 	kfree_skb(skb);
33571da177e4SLinus Torvalds }
33581da177e4SLinus Torvalds 
33591da177e4SLinus Torvalds /* SCO data packet */
33606039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
33611da177e4SLinus Torvalds {
33621da177e4SLinus Torvalds 	struct hci_sco_hdr *hdr = (void *) skb->data;
33631da177e4SLinus Torvalds 	struct hci_conn *conn;
33641da177e4SLinus Torvalds 	__u16 handle;
33651da177e4SLinus Torvalds 
33661da177e4SLinus Torvalds 	skb_pull(skb, HCI_SCO_HDR_SIZE);
33671da177e4SLinus Torvalds 
33681da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
33691da177e4SLinus Torvalds 
3370f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle);
33711da177e4SLinus Torvalds 
33721da177e4SLinus Torvalds 	hdev->stat.sco_rx++;
33731da177e4SLinus Torvalds 
33741da177e4SLinus Torvalds 	hci_dev_lock(hdev);
33751da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
33761da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
33771da177e4SLinus Torvalds 
33781da177e4SLinus Torvalds 	if (conn) {
33791da177e4SLinus Torvalds 		/* Send to upper protocol */
3380686ebf28SUlisses Furquim 		sco_recv_scodata(conn, skb);
33811da177e4SLinus Torvalds 		return;
33821da177e4SLinus Torvalds 	} else {
33831da177e4SLinus Torvalds 		BT_ERR("%s SCO packet for unknown connection handle %d",
33841da177e4SLinus Torvalds 		       hdev->name, handle);
33851da177e4SLinus Torvalds 	}
33861da177e4SLinus Torvalds 
33871da177e4SLinus Torvalds 	kfree_skb(skb);
33881da177e4SLinus Torvalds }
33891da177e4SLinus Torvalds 
33909238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev)
33919238f36aSJohan Hedberg {
33929238f36aSJohan Hedberg 	struct sk_buff *skb;
33939238f36aSJohan Hedberg 
33949238f36aSJohan Hedberg 	skb = skb_peek(&hdev->cmd_q);
33959238f36aSJohan Hedberg 	if (!skb)
33969238f36aSJohan Hedberg 		return true;
33979238f36aSJohan Hedberg 
33989238f36aSJohan Hedberg 	return bt_cb(skb)->req.start;
33999238f36aSJohan Hedberg }
34009238f36aSJohan Hedberg 
340142c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev)
340242c6b129SJohan Hedberg {
340342c6b129SJohan Hedberg 	struct hci_command_hdr *sent;
340442c6b129SJohan Hedberg 	struct sk_buff *skb;
340542c6b129SJohan Hedberg 	u16 opcode;
340642c6b129SJohan Hedberg 
340742c6b129SJohan Hedberg 	if (!hdev->sent_cmd)
340842c6b129SJohan Hedberg 		return;
340942c6b129SJohan Hedberg 
341042c6b129SJohan Hedberg 	sent = (void *) hdev->sent_cmd->data;
341142c6b129SJohan Hedberg 	opcode = __le16_to_cpu(sent->opcode);
341242c6b129SJohan Hedberg 	if (opcode == HCI_OP_RESET)
341342c6b129SJohan Hedberg 		return;
341442c6b129SJohan Hedberg 
341542c6b129SJohan Hedberg 	skb = skb_clone(hdev->sent_cmd, GFP_KERNEL);
341642c6b129SJohan Hedberg 	if (!skb)
341742c6b129SJohan Hedberg 		return;
341842c6b129SJohan Hedberg 
341942c6b129SJohan Hedberg 	skb_queue_head(&hdev->cmd_q, skb);
342042c6b129SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
342142c6b129SJohan Hedberg }
342242c6b129SJohan Hedberg 
34239238f36aSJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status)
34249238f36aSJohan Hedberg {
34259238f36aSJohan Hedberg 	hci_req_complete_t req_complete = NULL;
34269238f36aSJohan Hedberg 	struct sk_buff *skb;
34279238f36aSJohan Hedberg 	unsigned long flags;
34289238f36aSJohan Hedberg 
34299238f36aSJohan Hedberg 	BT_DBG("opcode 0x%04x status 0x%02x", opcode, status);
34309238f36aSJohan Hedberg 
343142c6b129SJohan Hedberg 	/* If the completed command doesn't match the last one that was
343242c6b129SJohan Hedberg 	 * sent we need to do special handling of it.
34339238f36aSJohan Hedberg 	 */
343442c6b129SJohan Hedberg 	if (!hci_sent_cmd_data(hdev, opcode)) {
343542c6b129SJohan Hedberg 		/* Some CSR based controllers generate a spontaneous
343642c6b129SJohan Hedberg 		 * reset complete event during init and any pending
343742c6b129SJohan Hedberg 		 * command will never be completed. In such a case we
343842c6b129SJohan Hedberg 		 * need to resend whatever was the last sent
343942c6b129SJohan Hedberg 		 * command.
344042c6b129SJohan Hedberg 		 */
344142c6b129SJohan Hedberg 		if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET)
344242c6b129SJohan Hedberg 			hci_resend_last(hdev);
344342c6b129SJohan Hedberg 
34449238f36aSJohan Hedberg 		return;
344542c6b129SJohan Hedberg 	}
34469238f36aSJohan Hedberg 
34479238f36aSJohan Hedberg 	/* If the command succeeded and there's still more commands in
34489238f36aSJohan Hedberg 	 * this request the request is not yet complete.
34499238f36aSJohan Hedberg 	 */
34509238f36aSJohan Hedberg 	if (!status && !hci_req_is_complete(hdev))
34519238f36aSJohan Hedberg 		return;
34529238f36aSJohan Hedberg 
34539238f36aSJohan Hedberg 	/* If this was the last command in a request the complete
34549238f36aSJohan Hedberg 	 * callback would be found in hdev->sent_cmd instead of the
34559238f36aSJohan Hedberg 	 * command queue (hdev->cmd_q).
34569238f36aSJohan Hedberg 	 */
34579238f36aSJohan Hedberg 	if (hdev->sent_cmd) {
34589238f36aSJohan Hedberg 		req_complete = bt_cb(hdev->sent_cmd)->req.complete;
345953e21fbcSJohan Hedberg 
346053e21fbcSJohan Hedberg 		if (req_complete) {
346153e21fbcSJohan Hedberg 			/* We must set the complete callback to NULL to
346253e21fbcSJohan Hedberg 			 * avoid calling the callback more than once if
346353e21fbcSJohan Hedberg 			 * this function gets called again.
346453e21fbcSJohan Hedberg 			 */
346553e21fbcSJohan Hedberg 			bt_cb(hdev->sent_cmd)->req.complete = NULL;
346653e21fbcSJohan Hedberg 
34679238f36aSJohan Hedberg 			goto call_complete;
34689238f36aSJohan Hedberg 		}
346953e21fbcSJohan Hedberg 	}
34709238f36aSJohan Hedberg 
34719238f36aSJohan Hedberg 	/* Remove all pending commands belonging to this request */
34729238f36aSJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
34739238f36aSJohan Hedberg 	while ((skb = __skb_dequeue(&hdev->cmd_q))) {
34749238f36aSJohan Hedberg 		if (bt_cb(skb)->req.start) {
34759238f36aSJohan Hedberg 			__skb_queue_head(&hdev->cmd_q, skb);
34769238f36aSJohan Hedberg 			break;
34779238f36aSJohan Hedberg 		}
34789238f36aSJohan Hedberg 
34799238f36aSJohan Hedberg 		req_complete = bt_cb(skb)->req.complete;
34809238f36aSJohan Hedberg 		kfree_skb(skb);
34819238f36aSJohan Hedberg 	}
34829238f36aSJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
34839238f36aSJohan Hedberg 
34849238f36aSJohan Hedberg call_complete:
34859238f36aSJohan Hedberg 	if (req_complete)
34869238f36aSJohan Hedberg 		req_complete(hdev, status);
34879238f36aSJohan Hedberg }
34889238f36aSJohan Hedberg 
3489b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work)
34901da177e4SLinus Torvalds {
3491b78752ccSMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work);
34921da177e4SLinus Torvalds 	struct sk_buff *skb;
34931da177e4SLinus Torvalds 
34941da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
34951da177e4SLinus Torvalds 
34961da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->rx_q))) {
3497cd82e61cSMarcel Holtmann 		/* Send copy to monitor */
3498cd82e61cSMarcel Holtmann 		hci_send_to_monitor(hdev, skb);
3499cd82e61cSMarcel Holtmann 
35001da177e4SLinus Torvalds 		if (atomic_read(&hdev->promisc)) {
35011da177e4SLinus Torvalds 			/* Send copy to the sockets */
3502470fe1b5SMarcel Holtmann 			hci_send_to_sock(hdev, skb);
35031da177e4SLinus Torvalds 		}
35041da177e4SLinus Torvalds 
35050736cfa8SMarcel Holtmann 		if (test_bit(HCI_RAW, &hdev->flags) ||
35060736cfa8SMarcel Holtmann 		    test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
35071da177e4SLinus Torvalds 			kfree_skb(skb);
35081da177e4SLinus Torvalds 			continue;
35091da177e4SLinus Torvalds 		}
35101da177e4SLinus Torvalds 
35111da177e4SLinus Torvalds 		if (test_bit(HCI_INIT, &hdev->flags)) {
35121da177e4SLinus Torvalds 			/* Don't process data packets in this states. */
35130d48d939SMarcel Holtmann 			switch (bt_cb(skb)->pkt_type) {
35141da177e4SLinus Torvalds 			case HCI_ACLDATA_PKT:
35151da177e4SLinus Torvalds 			case HCI_SCODATA_PKT:
35161da177e4SLinus Torvalds 				kfree_skb(skb);
35171da177e4SLinus Torvalds 				continue;
35183ff50b79SStephen Hemminger 			}
35191da177e4SLinus Torvalds 		}
35201da177e4SLinus Torvalds 
35211da177e4SLinus Torvalds 		/* Process frame */
35220d48d939SMarcel Holtmann 		switch (bt_cb(skb)->pkt_type) {
35231da177e4SLinus Torvalds 		case HCI_EVENT_PKT:
3524b78752ccSMarcel Holtmann 			BT_DBG("%s Event packet", hdev->name);
35251da177e4SLinus Torvalds 			hci_event_packet(hdev, skb);
35261da177e4SLinus Torvalds 			break;
35271da177e4SLinus Torvalds 
35281da177e4SLinus Torvalds 		case HCI_ACLDATA_PKT:
35291da177e4SLinus Torvalds 			BT_DBG("%s ACL data packet", hdev->name);
35301da177e4SLinus Torvalds 			hci_acldata_packet(hdev, skb);
35311da177e4SLinus Torvalds 			break;
35321da177e4SLinus Torvalds 
35331da177e4SLinus Torvalds 		case HCI_SCODATA_PKT:
35341da177e4SLinus Torvalds 			BT_DBG("%s SCO data packet", hdev->name);
35351da177e4SLinus Torvalds 			hci_scodata_packet(hdev, skb);
35361da177e4SLinus Torvalds 			break;
35371da177e4SLinus Torvalds 
35381da177e4SLinus Torvalds 		default:
35391da177e4SLinus Torvalds 			kfree_skb(skb);
35401da177e4SLinus Torvalds 			break;
35411da177e4SLinus Torvalds 		}
35421da177e4SLinus Torvalds 	}
35431da177e4SLinus Torvalds }
35441da177e4SLinus Torvalds 
3545c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work)
35461da177e4SLinus Torvalds {
3547c347b765SGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work);
35481da177e4SLinus Torvalds 	struct sk_buff *skb;
35491da177e4SLinus Torvalds 
35502104786bSAndrei Emeltchenko 	BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name,
35512104786bSAndrei Emeltchenko 	       atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q));
35521da177e4SLinus Torvalds 
35531da177e4SLinus Torvalds 	/* Send queued commands */
35545a08ecceSAndrei Emeltchenko 	if (atomic_read(&hdev->cmd_cnt)) {
35555a08ecceSAndrei Emeltchenko 		skb = skb_dequeue(&hdev->cmd_q);
35565a08ecceSAndrei Emeltchenko 		if (!skb)
35575a08ecceSAndrei Emeltchenko 			return;
35585a08ecceSAndrei Emeltchenko 
35591da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
35601da177e4SLinus Torvalds 
3561a675d7f1SMarcel Holtmann 		hdev->sent_cmd = skb_clone(skb, GFP_KERNEL);
356270f23020SAndrei Emeltchenko 		if (hdev->sent_cmd) {
35631da177e4SLinus Torvalds 			atomic_dec(&hdev->cmd_cnt);
35641da177e4SLinus Torvalds 			hci_send_frame(skb);
35657bdb8a5cSSzymon Janc 			if (test_bit(HCI_RESET, &hdev->flags))
35667bdb8a5cSSzymon Janc 				del_timer(&hdev->cmd_timer);
35677bdb8a5cSSzymon Janc 			else
35686bd32326SVille Tervo 				mod_timer(&hdev->cmd_timer,
35695f246e89SAndrei Emeltchenko 					  jiffies + HCI_CMD_TIMEOUT);
35701da177e4SLinus Torvalds 		} else {
35711da177e4SLinus Torvalds 			skb_queue_head(&hdev->cmd_q, skb);
3572c347b765SGustavo F. Padovan 			queue_work(hdev->workqueue, &hdev->cmd_work);
35731da177e4SLinus Torvalds 		}
35741da177e4SLinus Torvalds 	}
35751da177e4SLinus Torvalds }
35762519a1fcSAndre Guedes 
357731f7956cSAndre Guedes u8 bdaddr_to_le(u8 bdaddr_type)
357831f7956cSAndre Guedes {
357931f7956cSAndre Guedes 	switch (bdaddr_type) {
358031f7956cSAndre Guedes 	case BDADDR_LE_PUBLIC:
358131f7956cSAndre Guedes 		return ADDR_LE_DEV_PUBLIC;
358231f7956cSAndre Guedes 
358331f7956cSAndre Guedes 	default:
358431f7956cSAndre Guedes 		/* Fallback to LE Random address type */
358531f7956cSAndre Guedes 		return ADDR_LE_DEV_RANDOM;
358631f7956cSAndre Guedes 	}
358731f7956cSAndre Guedes }
3588