xref: /openbmc/linux/net/bluetooth/hci_core.c (revision 60f2a3ed)
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 
610d62e6d67SJohan Hedberg static void hci_set_event_mask_page_2(struct hci_request *req)
611d62e6d67SJohan Hedberg {
612d62e6d67SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
613d62e6d67SJohan Hedberg 	u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
614d62e6d67SJohan Hedberg 
615d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast master role is supported
616d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
617d62e6d67SJohan Hedberg 	 */
618d62e6d67SJohan Hedberg 	if (hdev->features[2][0] & 0x01) {
619d62e6d67SJohan Hedberg 		events[1] |= 0x40;	/* Triggered Clock Capture */
620d62e6d67SJohan Hedberg 		events[1] |= 0x80;	/* Synchronization Train Complete */
621d62e6d67SJohan Hedberg 		events[2] |= 0x10;	/* Slave Page Response Timeout */
622d62e6d67SJohan Hedberg 		events[2] |= 0x20;	/* CSB Channel Map Change */
623d62e6d67SJohan Hedberg 	}
624d62e6d67SJohan Hedberg 
625d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast slave role is supported
626d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
627d62e6d67SJohan Hedberg 	 */
628d62e6d67SJohan Hedberg 	if (hdev->features[2][0] & 0x02) {
629d62e6d67SJohan Hedberg 		events[2] |= 0x01;	/* Synchronization Train Received */
630d62e6d67SJohan Hedberg 		events[2] |= 0x02;	/* CSB Receive */
631d62e6d67SJohan Hedberg 		events[2] |= 0x04;	/* CSB Timeout */
632d62e6d67SJohan Hedberg 		events[2] |= 0x08;	/* Truncated Page Complete */
633d62e6d67SJohan Hedberg 	}
634d62e6d67SJohan Hedberg 
635d62e6d67SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2, sizeof(events), events);
636d62e6d67SJohan Hedberg }
637d62e6d67SJohan Hedberg 
63842c6b129SJohan Hedberg static void hci_init3_req(struct hci_request *req, unsigned long opt)
6392177bab5SJohan Hedberg {
64042c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
641d2c5d77fSJohan Hedberg 	u8 p;
64242c6b129SJohan Hedberg 
643b8f4e068SGustavo Padovan 	/* Some Broadcom based Bluetooth controllers do not support the
644b8f4e068SGustavo Padovan 	 * Delete Stored Link Key command. They are clearly indicating its
645b8f4e068SGustavo Padovan 	 * absence in the bit mask of supported commands.
646b8f4e068SGustavo Padovan 	 *
647b8f4e068SGustavo Padovan 	 * Check the supported commands and only if the the command is marked
648b8f4e068SGustavo Padovan 	 * as supported send it. If not supported assume that the controller
649b8f4e068SGustavo Padovan 	 * does not have actual support for stored link keys which makes this
650b8f4e068SGustavo Padovan 	 * command redundant anyway.
651b8f4e068SGustavo Padovan 	 */
65259f45d57SJohan Hedberg 	if (hdev->commands[6] & 0x80) {
65359f45d57SJohan Hedberg 		struct hci_cp_delete_stored_link_key cp;
65459f45d57SJohan Hedberg 
65559f45d57SJohan Hedberg 		bacpy(&cp.bdaddr, BDADDR_ANY);
65659f45d57SJohan Hedberg 		cp.delete_all = 0x01;
65759f45d57SJohan Hedberg 		hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY,
65859f45d57SJohan Hedberg 			    sizeof(cp), &cp);
65959f45d57SJohan Hedberg 	}
66059f45d57SJohan Hedberg 
6612177bab5SJohan Hedberg 	if (hdev->commands[5] & 0x10)
66242c6b129SJohan Hedberg 		hci_setup_link_policy(req);
6632177bab5SJohan Hedberg 
66404b4edcbSJohan Hedberg 	if (lmp_le_capable(hdev)) {
66542c6b129SJohan Hedberg 		hci_set_le_support(req);
66604b4edcbSJohan Hedberg 		hci_update_ad(req);
66704b4edcbSJohan Hedberg 	}
668d2c5d77fSJohan Hedberg 
669d2c5d77fSJohan Hedberg 	/* Read features beyond page 1 if available */
670d2c5d77fSJohan Hedberg 	for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
671d2c5d77fSJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
672d2c5d77fSJohan Hedberg 
673d2c5d77fSJohan Hedberg 		cp.page = p;
674d2c5d77fSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
675d2c5d77fSJohan Hedberg 			    sizeof(cp), &cp);
676d2c5d77fSJohan Hedberg 	}
6772177bab5SJohan Hedberg }
6782177bab5SJohan Hedberg 
6795d4e7e8dSJohan Hedberg static void hci_init4_req(struct hci_request *req, unsigned long opt)
6805d4e7e8dSJohan Hedberg {
6815d4e7e8dSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
6825d4e7e8dSJohan Hedberg 
683d62e6d67SJohan Hedberg 	/* Set event mask page 2 if the HCI command for it is supported */
684d62e6d67SJohan Hedberg 	if (hdev->commands[22] & 0x04)
685d62e6d67SJohan Hedberg 		hci_set_event_mask_page_2(req);
686d62e6d67SJohan Hedberg 
6875d4e7e8dSJohan Hedberg 	/* Check for Synchronization Train support */
6885d4e7e8dSJohan Hedberg 	if (hdev->features[2][0] & 0x04)
6895d4e7e8dSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL);
6905d4e7e8dSJohan Hedberg }
6915d4e7e8dSJohan Hedberg 
6922177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev)
6932177bab5SJohan Hedberg {
6942177bab5SJohan Hedberg 	int err;
6952177bab5SJohan Hedberg 
6962177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT);
6972177bab5SJohan Hedberg 	if (err < 0)
6982177bab5SJohan Hedberg 		return err;
6992177bab5SJohan Hedberg 
7002177bab5SJohan Hedberg 	/* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode
7012177bab5SJohan Hedberg 	 * BR/EDR/LE type controllers. AMP controllers only need the
7022177bab5SJohan Hedberg 	 * first stage init.
7032177bab5SJohan Hedberg 	 */
7042177bab5SJohan Hedberg 	if (hdev->dev_type != HCI_BREDR)
7052177bab5SJohan Hedberg 		return 0;
7062177bab5SJohan Hedberg 
7072177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT);
7082177bab5SJohan Hedberg 	if (err < 0)
7092177bab5SJohan Hedberg 		return err;
7102177bab5SJohan Hedberg 
7115d4e7e8dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT);
7125d4e7e8dSJohan Hedberg 	if (err < 0)
7135d4e7e8dSJohan Hedberg 		return err;
7145d4e7e8dSJohan Hedberg 
7155d4e7e8dSJohan Hedberg 	return __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT);
7162177bab5SJohan Hedberg }
7172177bab5SJohan Hedberg 
71842c6b129SJohan Hedberg static void hci_scan_req(struct hci_request *req, unsigned long opt)
7191da177e4SLinus Torvalds {
7201da177e4SLinus Torvalds 	__u8 scan = opt;
7211da177e4SLinus Torvalds 
72242c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, scan);
7231da177e4SLinus Torvalds 
7241da177e4SLinus Torvalds 	/* Inquiry and Page scans */
72542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
7261da177e4SLinus Torvalds }
7271da177e4SLinus Torvalds 
72842c6b129SJohan Hedberg static void hci_auth_req(struct hci_request *req, unsigned long opt)
7291da177e4SLinus Torvalds {
7301da177e4SLinus Torvalds 	__u8 auth = opt;
7311da177e4SLinus Torvalds 
73242c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, auth);
7331da177e4SLinus Torvalds 
7341da177e4SLinus Torvalds 	/* Authentication */
73542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
7361da177e4SLinus Torvalds }
7371da177e4SLinus Torvalds 
73842c6b129SJohan Hedberg static void hci_encrypt_req(struct hci_request *req, unsigned long opt)
7391da177e4SLinus Torvalds {
7401da177e4SLinus Torvalds 	__u8 encrypt = opt;
7411da177e4SLinus Torvalds 
74242c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, encrypt);
7431da177e4SLinus Torvalds 
744e4e8e37cSMarcel Holtmann 	/* Encryption */
74542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
7461da177e4SLinus Torvalds }
7471da177e4SLinus Torvalds 
74842c6b129SJohan Hedberg static void hci_linkpol_req(struct hci_request *req, unsigned long opt)
749e4e8e37cSMarcel Holtmann {
750e4e8e37cSMarcel Holtmann 	__le16 policy = cpu_to_le16(opt);
751e4e8e37cSMarcel Holtmann 
75242c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, policy);
753e4e8e37cSMarcel Holtmann 
754e4e8e37cSMarcel Holtmann 	/* Default link policy */
75542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
756e4e8e37cSMarcel Holtmann }
757e4e8e37cSMarcel Holtmann 
7581da177e4SLinus Torvalds /* Get HCI device by index.
7591da177e4SLinus Torvalds  * Device is held on return. */
7601da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index)
7611da177e4SLinus Torvalds {
7628035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev = NULL, *d;
7631da177e4SLinus Torvalds 
7641da177e4SLinus Torvalds 	BT_DBG("%d", index);
7651da177e4SLinus Torvalds 
7661da177e4SLinus Torvalds 	if (index < 0)
7671da177e4SLinus Torvalds 		return NULL;
7681da177e4SLinus Torvalds 
7691da177e4SLinus Torvalds 	read_lock(&hci_dev_list_lock);
7708035ded4SLuiz Augusto von Dentz 	list_for_each_entry(d, &hci_dev_list, list) {
7711da177e4SLinus Torvalds 		if (d->id == index) {
7721da177e4SLinus Torvalds 			hdev = hci_dev_hold(d);
7731da177e4SLinus Torvalds 			break;
7741da177e4SLinus Torvalds 		}
7751da177e4SLinus Torvalds 	}
7761da177e4SLinus Torvalds 	read_unlock(&hci_dev_list_lock);
7771da177e4SLinus Torvalds 	return hdev;
7781da177e4SLinus Torvalds }
7791da177e4SLinus Torvalds 
7801da177e4SLinus Torvalds /* ---- Inquiry support ---- */
781ff9ef578SJohan Hedberg 
78230dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev)
78330dc78e1SJohan Hedberg {
78430dc78e1SJohan Hedberg 	struct discovery_state *discov = &hdev->discovery;
78530dc78e1SJohan Hedberg 
7866fbe195dSAndre Guedes 	switch (discov->state) {
787343f935bSAndre Guedes 	case DISCOVERY_FINDING:
7886fbe195dSAndre Guedes 	case DISCOVERY_RESOLVING:
78930dc78e1SJohan Hedberg 		return true;
79030dc78e1SJohan Hedberg 
7916fbe195dSAndre Guedes 	default:
79230dc78e1SJohan Hedberg 		return false;
79330dc78e1SJohan Hedberg 	}
7946fbe195dSAndre Guedes }
79530dc78e1SJohan Hedberg 
796ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state)
797ff9ef578SJohan Hedberg {
798ff9ef578SJohan Hedberg 	BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state);
799ff9ef578SJohan Hedberg 
800ff9ef578SJohan Hedberg 	if (hdev->discovery.state == state)
801ff9ef578SJohan Hedberg 		return;
802ff9ef578SJohan Hedberg 
803ff9ef578SJohan Hedberg 	switch (state) {
804ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPED:
8057b99b659SAndre Guedes 		if (hdev->discovery.state != DISCOVERY_STARTING)
806ff9ef578SJohan Hedberg 			mgmt_discovering(hdev, 0);
807ff9ef578SJohan Hedberg 		break;
808ff9ef578SJohan Hedberg 	case DISCOVERY_STARTING:
809ff9ef578SJohan Hedberg 		break;
810343f935bSAndre Guedes 	case DISCOVERY_FINDING:
811ff9ef578SJohan Hedberg 		mgmt_discovering(hdev, 1);
812ff9ef578SJohan Hedberg 		break;
81330dc78e1SJohan Hedberg 	case DISCOVERY_RESOLVING:
81430dc78e1SJohan Hedberg 		break;
815ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPING:
816ff9ef578SJohan Hedberg 		break;
817ff9ef578SJohan Hedberg 	}
818ff9ef578SJohan Hedberg 
819ff9ef578SJohan Hedberg 	hdev->discovery.state = state;
820ff9ef578SJohan Hedberg }
821ff9ef578SJohan Hedberg 
8221f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev)
8231da177e4SLinus Torvalds {
82430883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
825b57c1a56SJohan Hedberg 	struct inquiry_entry *p, *n;
8261da177e4SLinus Torvalds 
827561aafbcSJohan Hedberg 	list_for_each_entry_safe(p, n, &cache->all, all) {
828561aafbcSJohan Hedberg 		list_del(&p->all);
829b57c1a56SJohan Hedberg 		kfree(p);
8301da177e4SLinus Torvalds 	}
831561aafbcSJohan Hedberg 
832561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->unknown);
833561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->resolve);
8341da177e4SLinus Torvalds }
8351da177e4SLinus Torvalds 
836a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
837a8c5fb1aSGustavo Padovan 					       bdaddr_t *bdaddr)
8381da177e4SLinus Torvalds {
83930883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
8401da177e4SLinus Torvalds 	struct inquiry_entry *e;
8411da177e4SLinus Torvalds 
8426ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
8431da177e4SLinus Torvalds 
844561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
8451da177e4SLinus Torvalds 		if (!bacmp(&e->data.bdaddr, bdaddr))
8461da177e4SLinus Torvalds 			return e;
8471da177e4SLinus Torvalds 	}
8481da177e4SLinus Torvalds 
849b57c1a56SJohan Hedberg 	return NULL;
850b57c1a56SJohan Hedberg }
851b57c1a56SJohan Hedberg 
852561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
853561aafbcSJohan Hedberg 						       bdaddr_t *bdaddr)
854561aafbcSJohan Hedberg {
85530883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
856561aafbcSJohan Hedberg 	struct inquiry_entry *e;
857561aafbcSJohan Hedberg 
8586ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
859561aafbcSJohan Hedberg 
860561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->unknown, list) {
861561aafbcSJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
862561aafbcSJohan Hedberg 			return e;
863561aafbcSJohan Hedberg 	}
864561aafbcSJohan Hedberg 
865561aafbcSJohan Hedberg 	return NULL;
866561aafbcSJohan Hedberg }
867561aafbcSJohan Hedberg 
86830dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
86930dc78e1SJohan Hedberg 						       bdaddr_t *bdaddr,
87030dc78e1SJohan Hedberg 						       int state)
87130dc78e1SJohan Hedberg {
87230dc78e1SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
87330dc78e1SJohan Hedberg 	struct inquiry_entry *e;
87430dc78e1SJohan Hedberg 
8756ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state);
87630dc78e1SJohan Hedberg 
87730dc78e1SJohan Hedberg 	list_for_each_entry(e, &cache->resolve, list) {
87830dc78e1SJohan Hedberg 		if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state)
87930dc78e1SJohan Hedberg 			return e;
88030dc78e1SJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
88130dc78e1SJohan Hedberg 			return e;
88230dc78e1SJohan Hedberg 	}
88330dc78e1SJohan Hedberg 
88430dc78e1SJohan Hedberg 	return NULL;
88530dc78e1SJohan Hedberg }
88630dc78e1SJohan Hedberg 
887a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
888a3d4e20aSJohan Hedberg 				      struct inquiry_entry *ie)
889a3d4e20aSJohan Hedberg {
890a3d4e20aSJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
891a3d4e20aSJohan Hedberg 	struct list_head *pos = &cache->resolve;
892a3d4e20aSJohan Hedberg 	struct inquiry_entry *p;
893a3d4e20aSJohan Hedberg 
894a3d4e20aSJohan Hedberg 	list_del(&ie->list);
895a3d4e20aSJohan Hedberg 
896a3d4e20aSJohan Hedberg 	list_for_each_entry(p, &cache->resolve, list) {
897a3d4e20aSJohan Hedberg 		if (p->name_state != NAME_PENDING &&
898a3d4e20aSJohan Hedberg 		    abs(p->data.rssi) >= abs(ie->data.rssi))
899a3d4e20aSJohan Hedberg 			break;
900a3d4e20aSJohan Hedberg 		pos = &p->list;
901a3d4e20aSJohan Hedberg 	}
902a3d4e20aSJohan Hedberg 
903a3d4e20aSJohan Hedberg 	list_add(&ie->list, pos);
904a3d4e20aSJohan Hedberg }
905a3d4e20aSJohan Hedberg 
9063175405bSJohan Hedberg bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
907388fc8faSJohan Hedberg 			      bool name_known, bool *ssp)
9081da177e4SLinus Torvalds {
90930883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
91070f23020SAndrei Emeltchenko 	struct inquiry_entry *ie;
9111da177e4SLinus Torvalds 
9126ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, &data->bdaddr);
9131da177e4SLinus Torvalds 
9142b2fec4dSSzymon Janc 	hci_remove_remote_oob_data(hdev, &data->bdaddr);
9152b2fec4dSSzymon Janc 
916388fc8faSJohan Hedberg 	if (ssp)
917388fc8faSJohan Hedberg 		*ssp = data->ssp_mode;
918388fc8faSJohan Hedberg 
91970f23020SAndrei Emeltchenko 	ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr);
920a3d4e20aSJohan Hedberg 	if (ie) {
921388fc8faSJohan Hedberg 		if (ie->data.ssp_mode && ssp)
922388fc8faSJohan Hedberg 			*ssp = true;
923388fc8faSJohan Hedberg 
924a3d4e20aSJohan Hedberg 		if (ie->name_state == NAME_NEEDED &&
925a3d4e20aSJohan Hedberg 		    data->rssi != ie->data.rssi) {
926a3d4e20aSJohan Hedberg 			ie->data.rssi = data->rssi;
927a3d4e20aSJohan Hedberg 			hci_inquiry_cache_update_resolve(hdev, ie);
928a3d4e20aSJohan Hedberg 		}
929a3d4e20aSJohan Hedberg 
930561aafbcSJohan Hedberg 		goto update;
931a3d4e20aSJohan Hedberg 	}
932561aafbcSJohan Hedberg 
9331da177e4SLinus Torvalds 	/* Entry not in the cache. Add new one. */
93470f23020SAndrei Emeltchenko 	ie = kzalloc(sizeof(struct inquiry_entry), GFP_ATOMIC);
93570f23020SAndrei Emeltchenko 	if (!ie)
9363175405bSJohan Hedberg 		return false;
93770f23020SAndrei Emeltchenko 
938561aafbcSJohan Hedberg 	list_add(&ie->all, &cache->all);
939561aafbcSJohan Hedberg 
940561aafbcSJohan Hedberg 	if (name_known) {
941561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
942561aafbcSJohan Hedberg 	} else {
943561aafbcSJohan Hedberg 		ie->name_state = NAME_NOT_KNOWN;
944561aafbcSJohan Hedberg 		list_add(&ie->list, &cache->unknown);
945561aafbcSJohan Hedberg 	}
946561aafbcSJohan Hedberg 
947561aafbcSJohan Hedberg update:
948561aafbcSJohan Hedberg 	if (name_known && ie->name_state != NAME_KNOWN &&
949561aafbcSJohan Hedberg 	    ie->name_state != NAME_PENDING) {
950561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
951561aafbcSJohan Hedberg 		list_del(&ie->list);
9521da177e4SLinus Torvalds 	}
9531da177e4SLinus Torvalds 
95470f23020SAndrei Emeltchenko 	memcpy(&ie->data, data, sizeof(*data));
95570f23020SAndrei Emeltchenko 	ie->timestamp = jiffies;
9561da177e4SLinus Torvalds 	cache->timestamp = jiffies;
9573175405bSJohan Hedberg 
9583175405bSJohan Hedberg 	if (ie->name_state == NAME_NOT_KNOWN)
9593175405bSJohan Hedberg 		return false;
9603175405bSJohan Hedberg 
9613175405bSJohan Hedberg 	return true;
9621da177e4SLinus Torvalds }
9631da177e4SLinus Torvalds 
9641da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf)
9651da177e4SLinus Torvalds {
96630883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
9671da177e4SLinus Torvalds 	struct inquiry_info *info = (struct inquiry_info *) buf;
9681da177e4SLinus Torvalds 	struct inquiry_entry *e;
9691da177e4SLinus Torvalds 	int copied = 0;
9701da177e4SLinus Torvalds 
971561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
9721da177e4SLinus Torvalds 		struct inquiry_data *data = &e->data;
973b57c1a56SJohan Hedberg 
974b57c1a56SJohan Hedberg 		if (copied >= num)
975b57c1a56SJohan Hedberg 			break;
976b57c1a56SJohan Hedberg 
9771da177e4SLinus Torvalds 		bacpy(&info->bdaddr, &data->bdaddr);
9781da177e4SLinus Torvalds 		info->pscan_rep_mode	= data->pscan_rep_mode;
9791da177e4SLinus Torvalds 		info->pscan_period_mode	= data->pscan_period_mode;
9801da177e4SLinus Torvalds 		info->pscan_mode	= data->pscan_mode;
9811da177e4SLinus Torvalds 		memcpy(info->dev_class, data->dev_class, 3);
9821da177e4SLinus Torvalds 		info->clock_offset	= data->clock_offset;
983b57c1a56SJohan Hedberg 
9841da177e4SLinus Torvalds 		info++;
985b57c1a56SJohan Hedberg 		copied++;
9861da177e4SLinus Torvalds 	}
9871da177e4SLinus Torvalds 
9881da177e4SLinus Torvalds 	BT_DBG("cache %p, copied %d", cache, copied);
9891da177e4SLinus Torvalds 	return copied;
9901da177e4SLinus Torvalds }
9911da177e4SLinus Torvalds 
99242c6b129SJohan Hedberg static void hci_inq_req(struct hci_request *req, unsigned long opt)
9931da177e4SLinus Torvalds {
9941da177e4SLinus Torvalds 	struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt;
99542c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
9961da177e4SLinus Torvalds 	struct hci_cp_inquiry cp;
9971da177e4SLinus Torvalds 
9981da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
9991da177e4SLinus Torvalds 
10001da177e4SLinus Torvalds 	if (test_bit(HCI_INQUIRY, &hdev->flags))
10011da177e4SLinus Torvalds 		return;
10021da177e4SLinus Torvalds 
10031da177e4SLinus Torvalds 	/* Start Inquiry */
10041da177e4SLinus Torvalds 	memcpy(&cp.lap, &ir->lap, 3);
10051da177e4SLinus Torvalds 	cp.length  = ir->length;
10061da177e4SLinus Torvalds 	cp.num_rsp = ir->num_rsp;
100742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);
10081da177e4SLinus Torvalds }
10091da177e4SLinus Torvalds 
10103e13fa1eSAndre Guedes static int wait_inquiry(void *word)
10113e13fa1eSAndre Guedes {
10123e13fa1eSAndre Guedes 	schedule();
10133e13fa1eSAndre Guedes 	return signal_pending(current);
10143e13fa1eSAndre Guedes }
10153e13fa1eSAndre Guedes 
10161da177e4SLinus Torvalds int hci_inquiry(void __user *arg)
10171da177e4SLinus Torvalds {
10181da177e4SLinus Torvalds 	__u8 __user *ptr = arg;
10191da177e4SLinus Torvalds 	struct hci_inquiry_req ir;
10201da177e4SLinus Torvalds 	struct hci_dev *hdev;
10211da177e4SLinus Torvalds 	int err = 0, do_inquiry = 0, max_rsp;
10221da177e4SLinus Torvalds 	long timeo;
10231da177e4SLinus Torvalds 	__u8 *buf;
10241da177e4SLinus Torvalds 
10251da177e4SLinus Torvalds 	if (copy_from_user(&ir, ptr, sizeof(ir)))
10261da177e4SLinus Torvalds 		return -EFAULT;
10271da177e4SLinus Torvalds 
10285a08ecceSAndrei Emeltchenko 	hdev = hci_dev_get(ir.dev_id);
10295a08ecceSAndrei Emeltchenko 	if (!hdev)
10301da177e4SLinus Torvalds 		return -ENODEV;
10311da177e4SLinus Torvalds 
10320736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
10330736cfa8SMarcel Holtmann 		err = -EBUSY;
10340736cfa8SMarcel Holtmann 		goto done;
10350736cfa8SMarcel Holtmann 	}
10360736cfa8SMarcel Holtmann 
103709fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
10381da177e4SLinus Torvalds 	if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
1039a8c5fb1aSGustavo Padovan 	    inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {
10401f9b9a5dSAndre Guedes 		hci_inquiry_cache_flush(hdev);
10411da177e4SLinus Torvalds 		do_inquiry = 1;
10421da177e4SLinus Torvalds 	}
104309fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
10441da177e4SLinus Torvalds 
104504837f64SMarcel Holtmann 	timeo = ir.length * msecs_to_jiffies(2000);
104670f23020SAndrei Emeltchenko 
104770f23020SAndrei Emeltchenko 	if (do_inquiry) {
104801178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir,
104901178cd4SJohan Hedberg 				   timeo);
105070f23020SAndrei Emeltchenko 		if (err < 0)
10511da177e4SLinus Torvalds 			goto done;
10523e13fa1eSAndre Guedes 
10533e13fa1eSAndre Guedes 		/* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is
10543e13fa1eSAndre Guedes 		 * cleared). If it is interrupted by a signal, return -EINTR.
10553e13fa1eSAndre Guedes 		 */
10563e13fa1eSAndre Guedes 		if (wait_on_bit(&hdev->flags, HCI_INQUIRY, wait_inquiry,
10573e13fa1eSAndre Guedes 				TASK_INTERRUPTIBLE))
10583e13fa1eSAndre Guedes 			return -EINTR;
105970f23020SAndrei Emeltchenko 	}
10601da177e4SLinus Torvalds 
10618fc9ced3SGustavo Padovan 	/* for unlimited number of responses we will use buffer with
10628fc9ced3SGustavo Padovan 	 * 255 entries
10638fc9ced3SGustavo Padovan 	 */
10641da177e4SLinus Torvalds 	max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp;
10651da177e4SLinus Torvalds 
10661da177e4SLinus Torvalds 	/* cache_dump can't sleep. Therefore we allocate temp buffer and then
10671da177e4SLinus Torvalds 	 * copy it to the user space.
10681da177e4SLinus Torvalds 	 */
106970f23020SAndrei Emeltchenko 	buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL);
107070f23020SAndrei Emeltchenko 	if (!buf) {
10711da177e4SLinus Torvalds 		err = -ENOMEM;
10721da177e4SLinus Torvalds 		goto done;
10731da177e4SLinus Torvalds 	}
10741da177e4SLinus Torvalds 
107509fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
10761da177e4SLinus Torvalds 	ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf);
107709fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
10781da177e4SLinus Torvalds 
10791da177e4SLinus Torvalds 	BT_DBG("num_rsp %d", ir.num_rsp);
10801da177e4SLinus Torvalds 
10811da177e4SLinus Torvalds 	if (!copy_to_user(ptr, &ir, sizeof(ir))) {
10821da177e4SLinus Torvalds 		ptr += sizeof(ir);
10831da177e4SLinus Torvalds 		if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) *
10841da177e4SLinus Torvalds 				 ir.num_rsp))
10851da177e4SLinus Torvalds 			err = -EFAULT;
10861da177e4SLinus Torvalds 	} else
10871da177e4SLinus Torvalds 		err = -EFAULT;
10881da177e4SLinus Torvalds 
10891da177e4SLinus Torvalds 	kfree(buf);
10901da177e4SLinus Torvalds 
10911da177e4SLinus Torvalds done:
10921da177e4SLinus Torvalds 	hci_dev_put(hdev);
10931da177e4SLinus Torvalds 	return err;
10941da177e4SLinus Torvalds }
10951da177e4SLinus Torvalds 
10963f0f524bSJohan Hedberg static u8 create_ad(struct hci_dev *hdev, u8 *ptr)
10973f0f524bSJohan Hedberg {
10983f0f524bSJohan Hedberg 	u8 ad_len = 0, flags = 0;
10993f0f524bSJohan Hedberg 	size_t name_len;
11003f0f524bSJohan Hedberg 
11013f0f524bSJohan Hedberg 	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags))
11023f0f524bSJohan Hedberg 		flags |= LE_AD_GENERAL;
11033f0f524bSJohan Hedberg 
11043f0f524bSJohan Hedberg 	if (!lmp_bredr_capable(hdev))
11053f0f524bSJohan Hedberg 		flags |= LE_AD_NO_BREDR;
11063f0f524bSJohan Hedberg 
11073f0f524bSJohan Hedberg 	if (lmp_le_br_capable(hdev))
11083f0f524bSJohan Hedberg 		flags |= LE_AD_SIM_LE_BREDR_CTRL;
11093f0f524bSJohan Hedberg 
11103f0f524bSJohan Hedberg 	if (lmp_host_le_br_capable(hdev))
11113f0f524bSJohan Hedberg 		flags |= LE_AD_SIM_LE_BREDR_HOST;
11123f0f524bSJohan Hedberg 
11133f0f524bSJohan Hedberg 	if (flags) {
11143f0f524bSJohan Hedberg 		BT_DBG("adv flags 0x%02x", flags);
11153f0f524bSJohan Hedberg 
11163f0f524bSJohan Hedberg 		ptr[0] = 2;
11173f0f524bSJohan Hedberg 		ptr[1] = EIR_FLAGS;
11183f0f524bSJohan Hedberg 		ptr[2] = flags;
11193f0f524bSJohan Hedberg 
11203f0f524bSJohan Hedberg 		ad_len += 3;
11213f0f524bSJohan Hedberg 		ptr += 3;
11223f0f524bSJohan Hedberg 	}
11233f0f524bSJohan Hedberg 
11243f0f524bSJohan Hedberg 	if (hdev->adv_tx_power != HCI_TX_POWER_INVALID) {
11253f0f524bSJohan Hedberg 		ptr[0] = 2;
11263f0f524bSJohan Hedberg 		ptr[1] = EIR_TX_POWER;
11273f0f524bSJohan Hedberg 		ptr[2] = (u8) hdev->adv_tx_power;
11283f0f524bSJohan Hedberg 
11293f0f524bSJohan Hedberg 		ad_len += 3;
11303f0f524bSJohan Hedberg 		ptr += 3;
11313f0f524bSJohan Hedberg 	}
11323f0f524bSJohan Hedberg 
11333f0f524bSJohan Hedberg 	name_len = strlen(hdev->dev_name);
11343f0f524bSJohan Hedberg 	if (name_len > 0) {
11353f0f524bSJohan Hedberg 		size_t max_len = HCI_MAX_AD_LENGTH - ad_len - 2;
11363f0f524bSJohan Hedberg 
11373f0f524bSJohan Hedberg 		if (name_len > max_len) {
11383f0f524bSJohan Hedberg 			name_len = max_len;
11393f0f524bSJohan Hedberg 			ptr[1] = EIR_NAME_SHORT;
11403f0f524bSJohan Hedberg 		} else
11413f0f524bSJohan Hedberg 			ptr[1] = EIR_NAME_COMPLETE;
11423f0f524bSJohan Hedberg 
11433f0f524bSJohan Hedberg 		ptr[0] = name_len + 1;
11443f0f524bSJohan Hedberg 
11453f0f524bSJohan Hedberg 		memcpy(ptr + 2, hdev->dev_name, name_len);
11463f0f524bSJohan Hedberg 
11473f0f524bSJohan Hedberg 		ad_len += (name_len + 2);
11483f0f524bSJohan Hedberg 		ptr += (name_len + 2);
11493f0f524bSJohan Hedberg 	}
11503f0f524bSJohan Hedberg 
11513f0f524bSJohan Hedberg 	return ad_len;
11523f0f524bSJohan Hedberg }
11533f0f524bSJohan Hedberg 
115404b4edcbSJohan Hedberg void hci_update_ad(struct hci_request *req)
11553f0f524bSJohan Hedberg {
115604b4edcbSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
11573f0f524bSJohan Hedberg 	struct hci_cp_le_set_adv_data cp;
11583f0f524bSJohan Hedberg 	u8 len;
11593f0f524bSJohan Hedberg 
116004b4edcbSJohan Hedberg 	if (!lmp_le_capable(hdev))
116104b4edcbSJohan Hedberg 		return;
11623f0f524bSJohan Hedberg 
11633f0f524bSJohan Hedberg 	memset(&cp, 0, sizeof(cp));
11643f0f524bSJohan Hedberg 
11653f0f524bSJohan Hedberg 	len = create_ad(hdev, cp.data);
11663f0f524bSJohan Hedberg 
11673f0f524bSJohan Hedberg 	if (hdev->adv_data_len == len &&
116804b4edcbSJohan Hedberg 	    memcmp(cp.data, hdev->adv_data, len) == 0)
116904b4edcbSJohan Hedberg 		return;
11703f0f524bSJohan Hedberg 
11713f0f524bSJohan Hedberg 	memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
11723f0f524bSJohan Hedberg 	hdev->adv_data_len = len;
11733f0f524bSJohan Hedberg 
11743f0f524bSJohan Hedberg 	cp.length = len;
11753f0f524bSJohan Hedberg 
117604b4edcbSJohan Hedberg 	hci_req_add(req, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp);
11773f0f524bSJohan Hedberg }
11783f0f524bSJohan Hedberg 
11791da177e4SLinus Torvalds /* ---- HCI ioctl helpers ---- */
11801da177e4SLinus Torvalds 
11811da177e4SLinus Torvalds int hci_dev_open(__u16 dev)
11821da177e4SLinus Torvalds {
11831da177e4SLinus Torvalds 	struct hci_dev *hdev;
11841da177e4SLinus Torvalds 	int ret = 0;
11851da177e4SLinus Torvalds 
11865a08ecceSAndrei Emeltchenko 	hdev = hci_dev_get(dev);
11875a08ecceSAndrei Emeltchenko 	if (!hdev)
11881da177e4SLinus Torvalds 		return -ENODEV;
11891da177e4SLinus Torvalds 
11901da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
11911da177e4SLinus Torvalds 
11921da177e4SLinus Torvalds 	hci_req_lock(hdev);
11931da177e4SLinus Torvalds 
119494324962SJohan Hovold 	if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) {
119594324962SJohan Hovold 		ret = -ENODEV;
119694324962SJohan Hovold 		goto done;
119794324962SJohan Hovold 	}
119894324962SJohan Hovold 
1199bf543036SJohan Hedberg 	/* Check for rfkill but allow the HCI setup stage to proceed
1200bf543036SJohan Hedberg 	 * (which in itself doesn't cause any RF activity).
1201bf543036SJohan Hedberg 	 */
1202bf543036SJohan Hedberg 	if (test_bit(HCI_RFKILLED, &hdev->dev_flags) &&
1203bf543036SJohan Hedberg 	    !test_bit(HCI_SETUP, &hdev->dev_flags)) {
1204611b30f7SMarcel Holtmann 		ret = -ERFKILL;
1205611b30f7SMarcel Holtmann 		goto done;
1206611b30f7SMarcel Holtmann 	}
1207611b30f7SMarcel Holtmann 
12081da177e4SLinus Torvalds 	if (test_bit(HCI_UP, &hdev->flags)) {
12091da177e4SLinus Torvalds 		ret = -EALREADY;
12101da177e4SLinus Torvalds 		goto done;
12111da177e4SLinus Torvalds 	}
12121da177e4SLinus Torvalds 
12131da177e4SLinus Torvalds 	if (hdev->open(hdev)) {
12141da177e4SLinus Torvalds 		ret = -EIO;
12151da177e4SLinus Torvalds 		goto done;
12161da177e4SLinus Torvalds 	}
12171da177e4SLinus Torvalds 
12181da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
12191da177e4SLinus Torvalds 	set_bit(HCI_INIT, &hdev->flags);
1220f41c70c4SMarcel Holtmann 
1221f41c70c4SMarcel Holtmann 	if (hdev->setup && test_bit(HCI_SETUP, &hdev->dev_flags))
1222f41c70c4SMarcel Holtmann 		ret = hdev->setup(hdev);
1223f41c70c4SMarcel Holtmann 
1224f41c70c4SMarcel Holtmann 	if (!ret) {
1225f41c70c4SMarcel Holtmann 		/* Treat all non BR/EDR controllers as raw devices if
1226f41c70c4SMarcel Holtmann 		 * enable_hs is not set.
1227f41c70c4SMarcel Holtmann 		 */
1228f41c70c4SMarcel Holtmann 		if (hdev->dev_type != HCI_BREDR && !enable_hs)
1229f41c70c4SMarcel Holtmann 			set_bit(HCI_RAW, &hdev->flags);
1230f41c70c4SMarcel Holtmann 
1231f41c70c4SMarcel Holtmann 		if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
1232f41c70c4SMarcel Holtmann 			set_bit(HCI_RAW, &hdev->flags);
1233f41c70c4SMarcel Holtmann 
12340736cfa8SMarcel Holtmann 		if (!test_bit(HCI_RAW, &hdev->flags) &&
12350736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
12362177bab5SJohan Hedberg 			ret = __hci_init(hdev);
12371da177e4SLinus Torvalds 	}
12381da177e4SLinus Torvalds 
1239f41c70c4SMarcel Holtmann 	clear_bit(HCI_INIT, &hdev->flags);
1240f41c70c4SMarcel Holtmann 
12411da177e4SLinus Torvalds 	if (!ret) {
12421da177e4SLinus Torvalds 		hci_dev_hold(hdev);
12431da177e4SLinus Torvalds 		set_bit(HCI_UP, &hdev->flags);
12441da177e4SLinus Torvalds 		hci_notify(hdev, HCI_DEV_UP);
1245bb4b2a9aSAndrei Emeltchenko 		if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
12460736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
1247bb4b2a9aSAndrei Emeltchenko 		    mgmt_valid_hdev(hdev)) {
124809fd0de5SGustavo F. Padovan 			hci_dev_lock(hdev);
1249744cf19eSJohan Hedberg 			mgmt_powered(hdev, 1);
125009fd0de5SGustavo F. Padovan 			hci_dev_unlock(hdev);
125156e5cb86SJohan Hedberg 		}
12521da177e4SLinus Torvalds 	} else {
12531da177e4SLinus Torvalds 		/* Init failed, cleanup */
12543eff45eaSGustavo F. Padovan 		flush_work(&hdev->tx_work);
1255c347b765SGustavo F. Padovan 		flush_work(&hdev->cmd_work);
1256b78752ccSMarcel Holtmann 		flush_work(&hdev->rx_work);
12571da177e4SLinus Torvalds 
12581da177e4SLinus Torvalds 		skb_queue_purge(&hdev->cmd_q);
12591da177e4SLinus Torvalds 		skb_queue_purge(&hdev->rx_q);
12601da177e4SLinus Torvalds 
12611da177e4SLinus Torvalds 		if (hdev->flush)
12621da177e4SLinus Torvalds 			hdev->flush(hdev);
12631da177e4SLinus Torvalds 
12641da177e4SLinus Torvalds 		if (hdev->sent_cmd) {
12651da177e4SLinus Torvalds 			kfree_skb(hdev->sent_cmd);
12661da177e4SLinus Torvalds 			hdev->sent_cmd = NULL;
12671da177e4SLinus Torvalds 		}
12681da177e4SLinus Torvalds 
12691da177e4SLinus Torvalds 		hdev->close(hdev);
12701da177e4SLinus Torvalds 		hdev->flags = 0;
12711da177e4SLinus Torvalds 	}
12721da177e4SLinus Torvalds 
12731da177e4SLinus Torvalds done:
12741da177e4SLinus Torvalds 	hci_req_unlock(hdev);
12751da177e4SLinus Torvalds 	hci_dev_put(hdev);
12761da177e4SLinus Torvalds 	return ret;
12771da177e4SLinus Torvalds }
12781da177e4SLinus Torvalds 
12791da177e4SLinus Torvalds static int hci_dev_do_close(struct hci_dev *hdev)
12801da177e4SLinus Torvalds {
12811da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
12821da177e4SLinus Torvalds 
128378c04c0bSVinicius Costa Gomes 	cancel_delayed_work(&hdev->power_off);
128478c04c0bSVinicius Costa Gomes 
12851da177e4SLinus Torvalds 	hci_req_cancel(hdev, ENODEV);
12861da177e4SLinus Torvalds 	hci_req_lock(hdev);
12871da177e4SLinus Torvalds 
12881da177e4SLinus Torvalds 	if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
1289b79f44c1SVinicius Costa Gomes 		del_timer_sync(&hdev->cmd_timer);
12901da177e4SLinus Torvalds 		hci_req_unlock(hdev);
12911da177e4SLinus Torvalds 		return 0;
12921da177e4SLinus Torvalds 	}
12931da177e4SLinus Torvalds 
12943eff45eaSGustavo F. Padovan 	/* Flush RX and TX works */
12953eff45eaSGustavo F. Padovan 	flush_work(&hdev->tx_work);
1296b78752ccSMarcel Holtmann 	flush_work(&hdev->rx_work);
12971da177e4SLinus Torvalds 
129816ab91abSJohan Hedberg 	if (hdev->discov_timeout > 0) {
1299e0f9309fSJohan Hedberg 		cancel_delayed_work(&hdev->discov_off);
130016ab91abSJohan Hedberg 		hdev->discov_timeout = 0;
13015e5282bbSJohan Hedberg 		clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
130216ab91abSJohan Hedberg 	}
130316ab91abSJohan Hedberg 
1304a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
13057d78525dSJohan Hedberg 		cancel_delayed_work(&hdev->service_cache);
13067d78525dSJohan Hedberg 
13077ba8b4beSAndre Guedes 	cancel_delayed_work_sync(&hdev->le_scan_disable);
13087ba8b4beSAndre Guedes 
130909fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
13101f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
13111da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
131209fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
13131da177e4SLinus Torvalds 
13141da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_DOWN);
13151da177e4SLinus Torvalds 
13161da177e4SLinus Torvalds 	if (hdev->flush)
13171da177e4SLinus Torvalds 		hdev->flush(hdev);
13181da177e4SLinus Torvalds 
13191da177e4SLinus Torvalds 	/* Reset device */
13201da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
13211da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
13228af59467SJohan Hedberg 	if (!test_bit(HCI_RAW, &hdev->flags) &&
1323a6c511c6SSzymon Janc 	    test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) {
13241da177e4SLinus Torvalds 		set_bit(HCI_INIT, &hdev->flags);
132501178cd4SJohan Hedberg 		__hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT);
13261da177e4SLinus Torvalds 		clear_bit(HCI_INIT, &hdev->flags);
13271da177e4SLinus Torvalds 	}
13281da177e4SLinus Torvalds 
1329c347b765SGustavo F. Padovan 	/* flush cmd  work */
1330c347b765SGustavo F. Padovan 	flush_work(&hdev->cmd_work);
13311da177e4SLinus Torvalds 
13321da177e4SLinus Torvalds 	/* Drop queues */
13331da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
13341da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
13351da177e4SLinus Torvalds 	skb_queue_purge(&hdev->raw_q);
13361da177e4SLinus Torvalds 
13371da177e4SLinus Torvalds 	/* Drop last sent command */
13381da177e4SLinus Torvalds 	if (hdev->sent_cmd) {
1339b79f44c1SVinicius Costa Gomes 		del_timer_sync(&hdev->cmd_timer);
13401da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
13411da177e4SLinus Torvalds 		hdev->sent_cmd = NULL;
13421da177e4SLinus Torvalds 	}
13431da177e4SLinus Torvalds 
1344b6ddb638SJohan Hedberg 	kfree_skb(hdev->recv_evt);
1345b6ddb638SJohan Hedberg 	hdev->recv_evt = NULL;
1346b6ddb638SJohan Hedberg 
13471da177e4SLinus Torvalds 	/* After this point our queues are empty
13481da177e4SLinus Torvalds 	 * and no tasks are scheduled. */
13491da177e4SLinus Torvalds 	hdev->close(hdev);
13501da177e4SLinus Torvalds 
135135b973c9SJohan Hedberg 	/* Clear flags */
135235b973c9SJohan Hedberg 	hdev->flags = 0;
135335b973c9SJohan Hedberg 	hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
135435b973c9SJohan Hedberg 
1355bb4b2a9aSAndrei Emeltchenko 	if (!test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags) &&
1356bb4b2a9aSAndrei Emeltchenko 	    mgmt_valid_hdev(hdev)) {
135709fd0de5SGustavo F. Padovan 		hci_dev_lock(hdev);
1358744cf19eSJohan Hedberg 		mgmt_powered(hdev, 0);
135909fd0de5SGustavo F. Padovan 		hci_dev_unlock(hdev);
13608ee56540SMarcel Holtmann 	}
13615add6af8SJohan Hedberg 
1362ced5c338SAndrei Emeltchenko 	/* Controller radio is available but is currently powered down */
1363ced5c338SAndrei Emeltchenko 	hdev->amp_status = 0;
1364ced5c338SAndrei Emeltchenko 
1365e59fda8dSJohan Hedberg 	memset(hdev->eir, 0, sizeof(hdev->eir));
136609b3c3fbSJohan Hedberg 	memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
1367e59fda8dSJohan Hedberg 
13681da177e4SLinus Torvalds 	hci_req_unlock(hdev);
13691da177e4SLinus Torvalds 
13701da177e4SLinus Torvalds 	hci_dev_put(hdev);
13711da177e4SLinus Torvalds 	return 0;
13721da177e4SLinus Torvalds }
13731da177e4SLinus Torvalds 
13741da177e4SLinus Torvalds int hci_dev_close(__u16 dev)
13751da177e4SLinus Torvalds {
13761da177e4SLinus Torvalds 	struct hci_dev *hdev;
13771da177e4SLinus Torvalds 	int err;
13781da177e4SLinus Torvalds 
137970f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
138070f23020SAndrei Emeltchenko 	if (!hdev)
13811da177e4SLinus Torvalds 		return -ENODEV;
13828ee56540SMarcel Holtmann 
13830736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
13840736cfa8SMarcel Holtmann 		err = -EBUSY;
13850736cfa8SMarcel Holtmann 		goto done;
13860736cfa8SMarcel Holtmann 	}
13870736cfa8SMarcel Holtmann 
13888ee56540SMarcel Holtmann 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
13898ee56540SMarcel Holtmann 		cancel_delayed_work(&hdev->power_off);
13908ee56540SMarcel Holtmann 
13911da177e4SLinus Torvalds 	err = hci_dev_do_close(hdev);
13928ee56540SMarcel Holtmann 
13930736cfa8SMarcel Holtmann done:
13941da177e4SLinus Torvalds 	hci_dev_put(hdev);
13951da177e4SLinus Torvalds 	return err;
13961da177e4SLinus Torvalds }
13971da177e4SLinus Torvalds 
13981da177e4SLinus Torvalds int hci_dev_reset(__u16 dev)
13991da177e4SLinus Torvalds {
14001da177e4SLinus Torvalds 	struct hci_dev *hdev;
14011da177e4SLinus Torvalds 	int ret = 0;
14021da177e4SLinus Torvalds 
140370f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
140470f23020SAndrei Emeltchenko 	if (!hdev)
14051da177e4SLinus Torvalds 		return -ENODEV;
14061da177e4SLinus Torvalds 
14071da177e4SLinus Torvalds 	hci_req_lock(hdev);
14081da177e4SLinus Torvalds 
1409808a049eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags)) {
1410808a049eSMarcel Holtmann 		ret = -ENETDOWN;
14111da177e4SLinus Torvalds 		goto done;
1412808a049eSMarcel Holtmann 	}
14131da177e4SLinus Torvalds 
14140736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
14150736cfa8SMarcel Holtmann 		ret = -EBUSY;
14160736cfa8SMarcel Holtmann 		goto done;
14170736cfa8SMarcel Holtmann 	}
14180736cfa8SMarcel Holtmann 
14191da177e4SLinus Torvalds 	/* Drop queues */
14201da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
14211da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
14221da177e4SLinus Torvalds 
142309fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
14241f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
14251da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
142609fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
14271da177e4SLinus Torvalds 
14281da177e4SLinus Torvalds 	if (hdev->flush)
14291da177e4SLinus Torvalds 		hdev->flush(hdev);
14301da177e4SLinus Torvalds 
14311da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
14326ed58ec5SVille Tervo 	hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
14331da177e4SLinus Torvalds 
14341da177e4SLinus Torvalds 	if (!test_bit(HCI_RAW, &hdev->flags))
143501178cd4SJohan Hedberg 		ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT);
14361da177e4SLinus Torvalds 
14371da177e4SLinus Torvalds done:
14381da177e4SLinus Torvalds 	hci_req_unlock(hdev);
14391da177e4SLinus Torvalds 	hci_dev_put(hdev);
14401da177e4SLinus Torvalds 	return ret;
14411da177e4SLinus Torvalds }
14421da177e4SLinus Torvalds 
14431da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev)
14441da177e4SLinus Torvalds {
14451da177e4SLinus Torvalds 	struct hci_dev *hdev;
14461da177e4SLinus Torvalds 	int ret = 0;
14471da177e4SLinus Torvalds 
144870f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
144970f23020SAndrei Emeltchenko 	if (!hdev)
14501da177e4SLinus Torvalds 		return -ENODEV;
14511da177e4SLinus Torvalds 
14520736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
14530736cfa8SMarcel Holtmann 		ret = -EBUSY;
14540736cfa8SMarcel Holtmann 		goto done;
14550736cfa8SMarcel Holtmann 	}
14560736cfa8SMarcel Holtmann 
14571da177e4SLinus Torvalds 	memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
14581da177e4SLinus Torvalds 
14590736cfa8SMarcel Holtmann done:
14601da177e4SLinus Torvalds 	hci_dev_put(hdev);
14611da177e4SLinus Torvalds 	return ret;
14621da177e4SLinus Torvalds }
14631da177e4SLinus Torvalds 
14641da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg)
14651da177e4SLinus Torvalds {
14661da177e4SLinus Torvalds 	struct hci_dev *hdev;
14671da177e4SLinus Torvalds 	struct hci_dev_req dr;
14681da177e4SLinus Torvalds 	int err = 0;
14691da177e4SLinus Torvalds 
14701da177e4SLinus Torvalds 	if (copy_from_user(&dr, arg, sizeof(dr)))
14711da177e4SLinus Torvalds 		return -EFAULT;
14721da177e4SLinus Torvalds 
147370f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dr.dev_id);
147470f23020SAndrei Emeltchenko 	if (!hdev)
14751da177e4SLinus Torvalds 		return -ENODEV;
14761da177e4SLinus Torvalds 
14770736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
14780736cfa8SMarcel Holtmann 		err = -EBUSY;
14790736cfa8SMarcel Holtmann 		goto done;
14800736cfa8SMarcel Holtmann 	}
14810736cfa8SMarcel Holtmann 
14821da177e4SLinus Torvalds 	switch (cmd) {
14831da177e4SLinus Torvalds 	case HCISETAUTH:
148401178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
14855f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
14861da177e4SLinus Torvalds 		break;
14871da177e4SLinus Torvalds 
14881da177e4SLinus Torvalds 	case HCISETENCRYPT:
14891da177e4SLinus Torvalds 		if (!lmp_encrypt_capable(hdev)) {
14901da177e4SLinus Torvalds 			err = -EOPNOTSUPP;
14911da177e4SLinus Torvalds 			break;
14921da177e4SLinus Torvalds 		}
14931da177e4SLinus Torvalds 
14941da177e4SLinus Torvalds 		if (!test_bit(HCI_AUTH, &hdev->flags)) {
14951da177e4SLinus Torvalds 			/* Auth must be enabled first */
149601178cd4SJohan Hedberg 			err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
14975f246e89SAndrei Emeltchenko 					   HCI_INIT_TIMEOUT);
14981da177e4SLinus Torvalds 			if (err)
14991da177e4SLinus Torvalds 				break;
15001da177e4SLinus Torvalds 		}
15011da177e4SLinus Torvalds 
150201178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
15035f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
15041da177e4SLinus Torvalds 		break;
15051da177e4SLinus Torvalds 
15061da177e4SLinus Torvalds 	case HCISETSCAN:
150701178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
15085f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
15091da177e4SLinus Torvalds 		break;
15101da177e4SLinus Torvalds 
15111da177e4SLinus Torvalds 	case HCISETLINKPOL:
151201178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
15135f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
15141da177e4SLinus Torvalds 		break;
15151da177e4SLinus Torvalds 
15161da177e4SLinus Torvalds 	case HCISETLINKMODE:
1517e4e8e37cSMarcel Holtmann 		hdev->link_mode = ((__u16) dr.dev_opt) &
1518e4e8e37cSMarcel Holtmann 					(HCI_LM_MASTER | HCI_LM_ACCEPT);
1519e4e8e37cSMarcel Holtmann 		break;
1520e4e8e37cSMarcel Holtmann 
1521e4e8e37cSMarcel Holtmann 	case HCISETPTYPE:
1522e4e8e37cSMarcel Holtmann 		hdev->pkt_type = (__u16) dr.dev_opt;
15231da177e4SLinus Torvalds 		break;
15241da177e4SLinus Torvalds 
15251da177e4SLinus Torvalds 	case HCISETACLMTU:
15261da177e4SLinus Torvalds 		hdev->acl_mtu  = *((__u16 *) &dr.dev_opt + 1);
15271da177e4SLinus Torvalds 		hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0);
15281da177e4SLinus Torvalds 		break;
15291da177e4SLinus Torvalds 
15301da177e4SLinus Torvalds 	case HCISETSCOMTU:
15311da177e4SLinus Torvalds 		hdev->sco_mtu  = *((__u16 *) &dr.dev_opt + 1);
15321da177e4SLinus Torvalds 		hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0);
15331da177e4SLinus Torvalds 		break;
15341da177e4SLinus Torvalds 
15351da177e4SLinus Torvalds 	default:
15361da177e4SLinus Torvalds 		err = -EINVAL;
15371da177e4SLinus Torvalds 		break;
15381da177e4SLinus Torvalds 	}
1539e4e8e37cSMarcel Holtmann 
15400736cfa8SMarcel Holtmann done:
15411da177e4SLinus Torvalds 	hci_dev_put(hdev);
15421da177e4SLinus Torvalds 	return err;
15431da177e4SLinus Torvalds }
15441da177e4SLinus Torvalds 
15451da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg)
15461da177e4SLinus Torvalds {
15478035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev;
15481da177e4SLinus Torvalds 	struct hci_dev_list_req *dl;
15491da177e4SLinus Torvalds 	struct hci_dev_req *dr;
15501da177e4SLinus Torvalds 	int n = 0, size, err;
15511da177e4SLinus Torvalds 	__u16 dev_num;
15521da177e4SLinus Torvalds 
15531da177e4SLinus Torvalds 	if (get_user(dev_num, (__u16 __user *) arg))
15541da177e4SLinus Torvalds 		return -EFAULT;
15551da177e4SLinus Torvalds 
15561da177e4SLinus Torvalds 	if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr))
15571da177e4SLinus Torvalds 		return -EINVAL;
15581da177e4SLinus Torvalds 
15591da177e4SLinus Torvalds 	size = sizeof(*dl) + dev_num * sizeof(*dr);
15601da177e4SLinus Torvalds 
156170f23020SAndrei Emeltchenko 	dl = kzalloc(size, GFP_KERNEL);
156270f23020SAndrei Emeltchenko 	if (!dl)
15631da177e4SLinus Torvalds 		return -ENOMEM;
15641da177e4SLinus Torvalds 
15651da177e4SLinus Torvalds 	dr = dl->dev_req;
15661da177e4SLinus Torvalds 
1567f20d09d5SGustavo F. Padovan 	read_lock(&hci_dev_list_lock);
15688035ded4SLuiz Augusto von Dentz 	list_for_each_entry(hdev, &hci_dev_list, list) {
1569a8b2d5c2SJohan Hedberg 		if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
1570e0f9309fSJohan Hedberg 			cancel_delayed_work(&hdev->power_off);
1571c542a06cSJohan Hedberg 
1572a8b2d5c2SJohan Hedberg 		if (!test_bit(HCI_MGMT, &hdev->dev_flags))
1573a8b2d5c2SJohan Hedberg 			set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1574c542a06cSJohan Hedberg 
15751da177e4SLinus Torvalds 		(dr + n)->dev_id  = hdev->id;
15761da177e4SLinus Torvalds 		(dr + n)->dev_opt = hdev->flags;
1577c542a06cSJohan Hedberg 
15781da177e4SLinus Torvalds 		if (++n >= dev_num)
15791da177e4SLinus Torvalds 			break;
15801da177e4SLinus Torvalds 	}
1581f20d09d5SGustavo F. Padovan 	read_unlock(&hci_dev_list_lock);
15821da177e4SLinus Torvalds 
15831da177e4SLinus Torvalds 	dl->dev_num = n;
15841da177e4SLinus Torvalds 	size = sizeof(*dl) + n * sizeof(*dr);
15851da177e4SLinus Torvalds 
15861da177e4SLinus Torvalds 	err = copy_to_user(arg, dl, size);
15871da177e4SLinus Torvalds 	kfree(dl);
15881da177e4SLinus Torvalds 
15891da177e4SLinus Torvalds 	return err ? -EFAULT : 0;
15901da177e4SLinus Torvalds }
15911da177e4SLinus Torvalds 
15921da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg)
15931da177e4SLinus Torvalds {
15941da177e4SLinus Torvalds 	struct hci_dev *hdev;
15951da177e4SLinus Torvalds 	struct hci_dev_info di;
15961da177e4SLinus Torvalds 	int err = 0;
15971da177e4SLinus Torvalds 
15981da177e4SLinus Torvalds 	if (copy_from_user(&di, arg, sizeof(di)))
15991da177e4SLinus Torvalds 		return -EFAULT;
16001da177e4SLinus Torvalds 
160170f23020SAndrei Emeltchenko 	hdev = hci_dev_get(di.dev_id);
160270f23020SAndrei Emeltchenko 	if (!hdev)
16031da177e4SLinus Torvalds 		return -ENODEV;
16041da177e4SLinus Torvalds 
1605a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
16063243553fSJohan Hedberg 		cancel_delayed_work_sync(&hdev->power_off);
1607ab81cbf9SJohan Hedberg 
1608a8b2d5c2SJohan Hedberg 	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
1609a8b2d5c2SJohan Hedberg 		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1610c542a06cSJohan Hedberg 
16111da177e4SLinus Torvalds 	strcpy(di.name, hdev->name);
16121da177e4SLinus Torvalds 	di.bdaddr   = hdev->bdaddr;
1613*60f2a3edSMarcel Holtmann 	di.type     = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4);
16141da177e4SLinus Torvalds 	di.flags    = hdev->flags;
16151da177e4SLinus Torvalds 	di.pkt_type = hdev->pkt_type;
1616572c7f84SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
16171da177e4SLinus Torvalds 		di.acl_mtu  = hdev->acl_mtu;
16181da177e4SLinus Torvalds 		di.acl_pkts = hdev->acl_pkts;
16191da177e4SLinus Torvalds 		di.sco_mtu  = hdev->sco_mtu;
16201da177e4SLinus Torvalds 		di.sco_pkts = hdev->sco_pkts;
1621572c7f84SJohan Hedberg 	} else {
1622572c7f84SJohan Hedberg 		di.acl_mtu  = hdev->le_mtu;
1623572c7f84SJohan Hedberg 		di.acl_pkts = hdev->le_pkts;
1624572c7f84SJohan Hedberg 		di.sco_mtu  = 0;
1625572c7f84SJohan Hedberg 		di.sco_pkts = 0;
1626572c7f84SJohan Hedberg 	}
16271da177e4SLinus Torvalds 	di.link_policy = hdev->link_policy;
16281da177e4SLinus Torvalds 	di.link_mode   = hdev->link_mode;
16291da177e4SLinus Torvalds 
16301da177e4SLinus Torvalds 	memcpy(&di.stat, &hdev->stat, sizeof(di.stat));
16311da177e4SLinus Torvalds 	memcpy(&di.features, &hdev->features, sizeof(di.features));
16321da177e4SLinus Torvalds 
16331da177e4SLinus Torvalds 	if (copy_to_user(arg, &di, sizeof(di)))
16341da177e4SLinus Torvalds 		err = -EFAULT;
16351da177e4SLinus Torvalds 
16361da177e4SLinus Torvalds 	hci_dev_put(hdev);
16371da177e4SLinus Torvalds 
16381da177e4SLinus Torvalds 	return err;
16391da177e4SLinus Torvalds }
16401da177e4SLinus Torvalds 
16411da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */
16421da177e4SLinus Torvalds 
1643611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked)
1644611b30f7SMarcel Holtmann {
1645611b30f7SMarcel Holtmann 	struct hci_dev *hdev = data;
1646611b30f7SMarcel Holtmann 
1647611b30f7SMarcel Holtmann 	BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
1648611b30f7SMarcel Holtmann 
16490736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
16500736cfa8SMarcel Holtmann 		return -EBUSY;
16510736cfa8SMarcel Holtmann 
16525e130367SJohan Hedberg 	if (blocked) {
16535e130367SJohan Hedberg 		set_bit(HCI_RFKILLED, &hdev->dev_flags);
1654bf543036SJohan Hedberg 		if (!test_bit(HCI_SETUP, &hdev->dev_flags))
1655611b30f7SMarcel Holtmann 			hci_dev_do_close(hdev);
16565e130367SJohan Hedberg 	} else {
16575e130367SJohan Hedberg 		clear_bit(HCI_RFKILLED, &hdev->dev_flags);
16585e130367SJohan Hedberg 	}
1659611b30f7SMarcel Holtmann 
1660611b30f7SMarcel Holtmann 	return 0;
1661611b30f7SMarcel Holtmann }
1662611b30f7SMarcel Holtmann 
1663611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = {
1664611b30f7SMarcel Holtmann 	.set_block = hci_rfkill_set_block,
1665611b30f7SMarcel Holtmann };
1666611b30f7SMarcel Holtmann 
1667ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work)
1668ab81cbf9SJohan Hedberg {
1669ab81cbf9SJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev, power_on);
167096570ffcSJohan Hedberg 	int err;
1671ab81cbf9SJohan Hedberg 
1672ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
1673ab81cbf9SJohan Hedberg 
167496570ffcSJohan Hedberg 	err = hci_dev_open(hdev->id);
167596570ffcSJohan Hedberg 	if (err < 0) {
167696570ffcSJohan Hedberg 		mgmt_set_powered_failed(hdev, err);
1677ab81cbf9SJohan Hedberg 		return;
167896570ffcSJohan Hedberg 	}
1679ab81cbf9SJohan Hedberg 
1680bf543036SJohan Hedberg 	if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
1681bf543036SJohan Hedberg 		clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
1682bf543036SJohan Hedberg 		hci_dev_do_close(hdev);
1683bf543036SJohan Hedberg 	} else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
168419202573SJohan Hedberg 		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
168519202573SJohan Hedberg 				   HCI_AUTO_OFF_TIMEOUT);
1686bf543036SJohan Hedberg 	}
1687ab81cbf9SJohan Hedberg 
1688a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))
1689744cf19eSJohan Hedberg 		mgmt_index_added(hdev);
1690ab81cbf9SJohan Hedberg }
1691ab81cbf9SJohan Hedberg 
1692ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work)
1693ab81cbf9SJohan Hedberg {
16943243553fSJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev,
16953243553fSJohan Hedberg 					    power_off.work);
1696ab81cbf9SJohan Hedberg 
1697ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
1698ab81cbf9SJohan Hedberg 
16998ee56540SMarcel Holtmann 	hci_dev_do_close(hdev);
1700ab81cbf9SJohan Hedberg }
1701ab81cbf9SJohan Hedberg 
170216ab91abSJohan Hedberg static void hci_discov_off(struct work_struct *work)
170316ab91abSJohan Hedberg {
170416ab91abSJohan Hedberg 	struct hci_dev *hdev;
170516ab91abSJohan Hedberg 	u8 scan = SCAN_PAGE;
170616ab91abSJohan Hedberg 
170716ab91abSJohan Hedberg 	hdev = container_of(work, struct hci_dev, discov_off.work);
170816ab91abSJohan Hedberg 
170916ab91abSJohan Hedberg 	BT_DBG("%s", hdev->name);
171016ab91abSJohan Hedberg 
171109fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
171216ab91abSJohan Hedberg 
171316ab91abSJohan Hedberg 	hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
171416ab91abSJohan Hedberg 
171516ab91abSJohan Hedberg 	hdev->discov_timeout = 0;
171616ab91abSJohan Hedberg 
171709fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
171816ab91abSJohan Hedberg }
171916ab91abSJohan Hedberg 
17202aeb9a1aSJohan Hedberg int hci_uuids_clear(struct hci_dev *hdev)
17212aeb9a1aSJohan Hedberg {
17224821002cSJohan Hedberg 	struct bt_uuid *uuid, *tmp;
17232aeb9a1aSJohan Hedberg 
17244821002cSJohan Hedberg 	list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) {
17254821002cSJohan Hedberg 		list_del(&uuid->list);
17262aeb9a1aSJohan Hedberg 		kfree(uuid);
17272aeb9a1aSJohan Hedberg 	}
17282aeb9a1aSJohan Hedberg 
17292aeb9a1aSJohan Hedberg 	return 0;
17302aeb9a1aSJohan Hedberg }
17312aeb9a1aSJohan Hedberg 
173255ed8ca1SJohan Hedberg int hci_link_keys_clear(struct hci_dev *hdev)
173355ed8ca1SJohan Hedberg {
173455ed8ca1SJohan Hedberg 	struct list_head *p, *n;
173555ed8ca1SJohan Hedberg 
173655ed8ca1SJohan Hedberg 	list_for_each_safe(p, n, &hdev->link_keys) {
173755ed8ca1SJohan Hedberg 		struct link_key *key;
173855ed8ca1SJohan Hedberg 
173955ed8ca1SJohan Hedberg 		key = list_entry(p, struct link_key, list);
174055ed8ca1SJohan Hedberg 
174155ed8ca1SJohan Hedberg 		list_del(p);
174255ed8ca1SJohan Hedberg 		kfree(key);
174355ed8ca1SJohan Hedberg 	}
174455ed8ca1SJohan Hedberg 
174555ed8ca1SJohan Hedberg 	return 0;
174655ed8ca1SJohan Hedberg }
174755ed8ca1SJohan Hedberg 
1748b899efafSVinicius Costa Gomes int hci_smp_ltks_clear(struct hci_dev *hdev)
1749b899efafSVinicius Costa Gomes {
1750b899efafSVinicius Costa Gomes 	struct smp_ltk *k, *tmp;
1751b899efafSVinicius Costa Gomes 
1752b899efafSVinicius Costa Gomes 	list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
1753b899efafSVinicius Costa Gomes 		list_del(&k->list);
1754b899efafSVinicius Costa Gomes 		kfree(k);
1755b899efafSVinicius Costa Gomes 	}
1756b899efafSVinicius Costa Gomes 
1757b899efafSVinicius Costa Gomes 	return 0;
1758b899efafSVinicius Costa Gomes }
1759b899efafSVinicius Costa Gomes 
176055ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
176155ed8ca1SJohan Hedberg {
176255ed8ca1SJohan Hedberg 	struct link_key *k;
176355ed8ca1SJohan Hedberg 
17648035ded4SLuiz Augusto von Dentz 	list_for_each_entry(k, &hdev->link_keys, list)
176555ed8ca1SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) == 0)
176655ed8ca1SJohan Hedberg 			return k;
176755ed8ca1SJohan Hedberg 
176855ed8ca1SJohan Hedberg 	return NULL;
176955ed8ca1SJohan Hedberg }
177055ed8ca1SJohan Hedberg 
1771745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
1772d25e28abSJohan Hedberg 			       u8 key_type, u8 old_key_type)
1773d25e28abSJohan Hedberg {
1774d25e28abSJohan Hedberg 	/* Legacy key */
1775d25e28abSJohan Hedberg 	if (key_type < 0x03)
1776745c0ce3SVishal Agarwal 		return true;
1777d25e28abSJohan Hedberg 
1778d25e28abSJohan Hedberg 	/* Debug keys are insecure so don't store them persistently */
1779d25e28abSJohan Hedberg 	if (key_type == HCI_LK_DEBUG_COMBINATION)
1780745c0ce3SVishal Agarwal 		return false;
1781d25e28abSJohan Hedberg 
1782d25e28abSJohan Hedberg 	/* Changed combination key and there's no previous one */
1783d25e28abSJohan Hedberg 	if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff)
1784745c0ce3SVishal Agarwal 		return false;
1785d25e28abSJohan Hedberg 
1786d25e28abSJohan Hedberg 	/* Security mode 3 case */
1787d25e28abSJohan Hedberg 	if (!conn)
1788745c0ce3SVishal Agarwal 		return true;
1789d25e28abSJohan Hedberg 
1790d25e28abSJohan Hedberg 	/* Neither local nor remote side had no-bonding as requirement */
1791d25e28abSJohan Hedberg 	if (conn->auth_type > 0x01 && conn->remote_auth > 0x01)
1792745c0ce3SVishal Agarwal 		return true;
1793d25e28abSJohan Hedberg 
1794d25e28abSJohan Hedberg 	/* Local side had dedicated bonding as requirement */
1795d25e28abSJohan Hedberg 	if (conn->auth_type == 0x02 || conn->auth_type == 0x03)
1796745c0ce3SVishal Agarwal 		return true;
1797d25e28abSJohan Hedberg 
1798d25e28abSJohan Hedberg 	/* Remote side had dedicated bonding as requirement */
1799d25e28abSJohan Hedberg 	if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03)
1800745c0ce3SVishal Agarwal 		return true;
1801d25e28abSJohan Hedberg 
1802d25e28abSJohan Hedberg 	/* If none of the above criteria match, then don't store the key
1803d25e28abSJohan Hedberg 	 * persistently */
1804745c0ce3SVishal Agarwal 	return false;
1805d25e28abSJohan Hedberg }
1806d25e28abSJohan Hedberg 
1807c9839a11SVinicius Costa Gomes struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8])
180875d262c2SVinicius Costa Gomes {
1809c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
181075d262c2SVinicius Costa Gomes 
1811c9839a11SVinicius Costa Gomes 	list_for_each_entry(k, &hdev->long_term_keys, list) {
1812c9839a11SVinicius Costa Gomes 		if (k->ediv != ediv ||
1813c9839a11SVinicius Costa Gomes 		    memcmp(rand, k->rand, sizeof(k->rand)))
181475d262c2SVinicius Costa Gomes 			continue;
181575d262c2SVinicius Costa Gomes 
181675d262c2SVinicius Costa Gomes 		return k;
181775d262c2SVinicius Costa Gomes 	}
181875d262c2SVinicius Costa Gomes 
181975d262c2SVinicius Costa Gomes 	return NULL;
182075d262c2SVinicius Costa Gomes }
182175d262c2SVinicius Costa Gomes 
1822c9839a11SVinicius Costa Gomes struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
1823c9839a11SVinicius Costa Gomes 				     u8 addr_type)
182475d262c2SVinicius Costa Gomes {
1825c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
182675d262c2SVinicius Costa Gomes 
1827c9839a11SVinicius Costa Gomes 	list_for_each_entry(k, &hdev->long_term_keys, list)
1828c9839a11SVinicius Costa Gomes 		if (addr_type == k->bdaddr_type &&
1829c9839a11SVinicius Costa Gomes 		    bacmp(bdaddr, &k->bdaddr) == 0)
183075d262c2SVinicius Costa Gomes 			return k;
183175d262c2SVinicius Costa Gomes 
183275d262c2SVinicius Costa Gomes 	return NULL;
183375d262c2SVinicius Costa Gomes }
183475d262c2SVinicius Costa Gomes 
1835d25e28abSJohan Hedberg int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
1836d25e28abSJohan Hedberg 		     bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len)
183755ed8ca1SJohan Hedberg {
183855ed8ca1SJohan Hedberg 	struct link_key *key, *old_key;
1839745c0ce3SVishal Agarwal 	u8 old_key_type;
1840745c0ce3SVishal Agarwal 	bool persistent;
184155ed8ca1SJohan Hedberg 
184255ed8ca1SJohan Hedberg 	old_key = hci_find_link_key(hdev, bdaddr);
184355ed8ca1SJohan Hedberg 	if (old_key) {
184455ed8ca1SJohan Hedberg 		old_key_type = old_key->type;
184555ed8ca1SJohan Hedberg 		key = old_key;
184655ed8ca1SJohan Hedberg 	} else {
184712adcf3aSJohan Hedberg 		old_key_type = conn ? conn->key_type : 0xff;
184855ed8ca1SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_ATOMIC);
184955ed8ca1SJohan Hedberg 		if (!key)
185055ed8ca1SJohan Hedberg 			return -ENOMEM;
185155ed8ca1SJohan Hedberg 		list_add(&key->list, &hdev->link_keys);
185255ed8ca1SJohan Hedberg 	}
185355ed8ca1SJohan Hedberg 
18546ed93dc6SAndrei Emeltchenko 	BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type);
185555ed8ca1SJohan Hedberg 
1856d25e28abSJohan Hedberg 	/* Some buggy controller combinations generate a changed
1857d25e28abSJohan Hedberg 	 * combination key for legacy pairing even when there's no
1858d25e28abSJohan Hedberg 	 * previous key */
1859d25e28abSJohan Hedberg 	if (type == HCI_LK_CHANGED_COMBINATION &&
1860a8c5fb1aSGustavo Padovan 	    (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) {
1861d25e28abSJohan Hedberg 		type = HCI_LK_COMBINATION;
1862655fe6ecSJohan Hedberg 		if (conn)
1863655fe6ecSJohan Hedberg 			conn->key_type = type;
1864655fe6ecSJohan Hedberg 	}
1865d25e28abSJohan Hedberg 
186655ed8ca1SJohan Hedberg 	bacpy(&key->bdaddr, bdaddr);
18679b3b4460SAndrei Emeltchenko 	memcpy(key->val, val, HCI_LINK_KEY_SIZE);
186855ed8ca1SJohan Hedberg 	key->pin_len = pin_len;
186955ed8ca1SJohan Hedberg 
1870b6020ba0SWaldemar Rymarkiewicz 	if (type == HCI_LK_CHANGED_COMBINATION)
187155ed8ca1SJohan Hedberg 		key->type = old_key_type;
18724748fed2SJohan Hedberg 	else
18734748fed2SJohan Hedberg 		key->type = type;
18744748fed2SJohan Hedberg 
18754df378a1SJohan Hedberg 	if (!new_key)
18764df378a1SJohan Hedberg 		return 0;
18774df378a1SJohan Hedberg 
18784df378a1SJohan Hedberg 	persistent = hci_persistent_key(hdev, conn, type, old_key_type);
18794df378a1SJohan Hedberg 
1880744cf19eSJohan Hedberg 	mgmt_new_link_key(hdev, key, persistent);
18814df378a1SJohan Hedberg 
18826ec5bcadSVishal Agarwal 	if (conn)
18836ec5bcadSVishal Agarwal 		conn->flush_key = !persistent;
188455ed8ca1SJohan Hedberg 
188555ed8ca1SJohan Hedberg 	return 0;
188655ed8ca1SJohan Hedberg }
188755ed8ca1SJohan Hedberg 
1888c9839a11SVinicius Costa Gomes int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
18899a006657SAndrei Emeltchenko 		int new_key, u8 authenticated, u8 tk[16], u8 enc_size, __le16
189004124681SGustavo F. Padovan 		ediv, u8 rand[8])
189175d262c2SVinicius Costa Gomes {
1892c9839a11SVinicius Costa Gomes 	struct smp_ltk *key, *old_key;
189375d262c2SVinicius Costa Gomes 
1894c9839a11SVinicius Costa Gomes 	if (!(type & HCI_SMP_STK) && !(type & HCI_SMP_LTK))
1895c9839a11SVinicius Costa Gomes 		return 0;
189675d262c2SVinicius Costa Gomes 
1897c9839a11SVinicius Costa Gomes 	old_key = hci_find_ltk_by_addr(hdev, bdaddr, addr_type);
1898c9839a11SVinicius Costa Gomes 	if (old_key)
189975d262c2SVinicius Costa Gomes 		key = old_key;
1900c9839a11SVinicius Costa Gomes 	else {
1901c9839a11SVinicius Costa Gomes 		key = kzalloc(sizeof(*key), GFP_ATOMIC);
190275d262c2SVinicius Costa Gomes 		if (!key)
190375d262c2SVinicius Costa Gomes 			return -ENOMEM;
1904c9839a11SVinicius Costa Gomes 		list_add(&key->list, &hdev->long_term_keys);
190575d262c2SVinicius Costa Gomes 	}
190675d262c2SVinicius Costa Gomes 
190775d262c2SVinicius Costa Gomes 	bacpy(&key->bdaddr, bdaddr);
1908c9839a11SVinicius Costa Gomes 	key->bdaddr_type = addr_type;
1909c9839a11SVinicius Costa Gomes 	memcpy(key->val, tk, sizeof(key->val));
1910c9839a11SVinicius Costa Gomes 	key->authenticated = authenticated;
1911c9839a11SVinicius Costa Gomes 	key->ediv = ediv;
1912c9839a11SVinicius Costa Gomes 	key->enc_size = enc_size;
1913c9839a11SVinicius Costa Gomes 	key->type = type;
1914c9839a11SVinicius Costa Gomes 	memcpy(key->rand, rand, sizeof(key->rand));
191575d262c2SVinicius Costa Gomes 
1916c9839a11SVinicius Costa Gomes 	if (!new_key)
1917c9839a11SVinicius Costa Gomes 		return 0;
191875d262c2SVinicius Costa Gomes 
1919261cc5aaSVinicius Costa Gomes 	if (type & HCI_SMP_LTK)
1920261cc5aaSVinicius Costa Gomes 		mgmt_new_ltk(hdev, key, 1);
1921261cc5aaSVinicius Costa Gomes 
192275d262c2SVinicius Costa Gomes 	return 0;
192375d262c2SVinicius Costa Gomes }
192475d262c2SVinicius Costa Gomes 
192555ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
192655ed8ca1SJohan Hedberg {
192755ed8ca1SJohan Hedberg 	struct link_key *key;
192855ed8ca1SJohan Hedberg 
192955ed8ca1SJohan Hedberg 	key = hci_find_link_key(hdev, bdaddr);
193055ed8ca1SJohan Hedberg 	if (!key)
193155ed8ca1SJohan Hedberg 		return -ENOENT;
193255ed8ca1SJohan Hedberg 
19336ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
193455ed8ca1SJohan Hedberg 
193555ed8ca1SJohan Hedberg 	list_del(&key->list);
193655ed8ca1SJohan Hedberg 	kfree(key);
193755ed8ca1SJohan Hedberg 
193855ed8ca1SJohan Hedberg 	return 0;
193955ed8ca1SJohan Hedberg }
194055ed8ca1SJohan Hedberg 
1941b899efafSVinicius Costa Gomes int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr)
1942b899efafSVinicius Costa Gomes {
1943b899efafSVinicius Costa Gomes 	struct smp_ltk *k, *tmp;
1944b899efafSVinicius Costa Gomes 
1945b899efafSVinicius Costa Gomes 	list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
1946b899efafSVinicius Costa Gomes 		if (bacmp(bdaddr, &k->bdaddr))
1947b899efafSVinicius Costa Gomes 			continue;
1948b899efafSVinicius Costa Gomes 
19496ed93dc6SAndrei Emeltchenko 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
1950b899efafSVinicius Costa Gomes 
1951b899efafSVinicius Costa Gomes 		list_del(&k->list);
1952b899efafSVinicius Costa Gomes 		kfree(k);
1953b899efafSVinicius Costa Gomes 	}
1954b899efafSVinicius Costa Gomes 
1955b899efafSVinicius Costa Gomes 	return 0;
1956b899efafSVinicius Costa Gomes }
1957b899efafSVinicius Costa Gomes 
19586bd32326SVille Tervo /* HCI command timer function */
1959bda4f23aSAndrei Emeltchenko static void hci_cmd_timeout(unsigned long arg)
19606bd32326SVille Tervo {
19616bd32326SVille Tervo 	struct hci_dev *hdev = (void *) arg;
19626bd32326SVille Tervo 
1963bda4f23aSAndrei Emeltchenko 	if (hdev->sent_cmd) {
1964bda4f23aSAndrei Emeltchenko 		struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data;
1965bda4f23aSAndrei Emeltchenko 		u16 opcode = __le16_to_cpu(sent->opcode);
1966bda4f23aSAndrei Emeltchenko 
1967bda4f23aSAndrei Emeltchenko 		BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode);
1968bda4f23aSAndrei Emeltchenko 	} else {
19696bd32326SVille Tervo 		BT_ERR("%s command tx timeout", hdev->name);
1970bda4f23aSAndrei Emeltchenko 	}
1971bda4f23aSAndrei Emeltchenko 
19726bd32326SVille Tervo 	atomic_set(&hdev->cmd_cnt, 1);
1973c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
19746bd32326SVille Tervo }
19756bd32326SVille Tervo 
19762763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
19772763eda6SSzymon Janc 					  bdaddr_t *bdaddr)
19782763eda6SSzymon Janc {
19792763eda6SSzymon Janc 	struct oob_data *data;
19802763eda6SSzymon Janc 
19812763eda6SSzymon Janc 	list_for_each_entry(data, &hdev->remote_oob_data, list)
19822763eda6SSzymon Janc 		if (bacmp(bdaddr, &data->bdaddr) == 0)
19832763eda6SSzymon Janc 			return data;
19842763eda6SSzymon Janc 
19852763eda6SSzymon Janc 	return NULL;
19862763eda6SSzymon Janc }
19872763eda6SSzymon Janc 
19882763eda6SSzymon Janc int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr)
19892763eda6SSzymon Janc {
19902763eda6SSzymon Janc 	struct oob_data *data;
19912763eda6SSzymon Janc 
19922763eda6SSzymon Janc 	data = hci_find_remote_oob_data(hdev, bdaddr);
19932763eda6SSzymon Janc 	if (!data)
19942763eda6SSzymon Janc 		return -ENOENT;
19952763eda6SSzymon Janc 
19966ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
19972763eda6SSzymon Janc 
19982763eda6SSzymon Janc 	list_del(&data->list);
19992763eda6SSzymon Janc 	kfree(data);
20002763eda6SSzymon Janc 
20012763eda6SSzymon Janc 	return 0;
20022763eda6SSzymon Janc }
20032763eda6SSzymon Janc 
20042763eda6SSzymon Janc int hci_remote_oob_data_clear(struct hci_dev *hdev)
20052763eda6SSzymon Janc {
20062763eda6SSzymon Janc 	struct oob_data *data, *n;
20072763eda6SSzymon Janc 
20082763eda6SSzymon Janc 	list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) {
20092763eda6SSzymon Janc 		list_del(&data->list);
20102763eda6SSzymon Janc 		kfree(data);
20112763eda6SSzymon Janc 	}
20122763eda6SSzymon Janc 
20132763eda6SSzymon Janc 	return 0;
20142763eda6SSzymon Janc }
20152763eda6SSzymon Janc 
20162763eda6SSzymon Janc int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
20172763eda6SSzymon Janc 			    u8 *randomizer)
20182763eda6SSzymon Janc {
20192763eda6SSzymon Janc 	struct oob_data *data;
20202763eda6SSzymon Janc 
20212763eda6SSzymon Janc 	data = hci_find_remote_oob_data(hdev, bdaddr);
20222763eda6SSzymon Janc 
20232763eda6SSzymon Janc 	if (!data) {
20242763eda6SSzymon Janc 		data = kmalloc(sizeof(*data), GFP_ATOMIC);
20252763eda6SSzymon Janc 		if (!data)
20262763eda6SSzymon Janc 			return -ENOMEM;
20272763eda6SSzymon Janc 
20282763eda6SSzymon Janc 		bacpy(&data->bdaddr, bdaddr);
20292763eda6SSzymon Janc 		list_add(&data->list, &hdev->remote_oob_data);
20302763eda6SSzymon Janc 	}
20312763eda6SSzymon Janc 
20322763eda6SSzymon Janc 	memcpy(data->hash, hash, sizeof(data->hash));
20332763eda6SSzymon Janc 	memcpy(data->randomizer, randomizer, sizeof(data->randomizer));
20342763eda6SSzymon Janc 
20356ed93dc6SAndrei Emeltchenko 	BT_DBG("%s for %pMR", hdev->name, bdaddr);
20362763eda6SSzymon Janc 
20372763eda6SSzymon Janc 	return 0;
20382763eda6SSzymon Janc }
20392763eda6SSzymon Janc 
204004124681SGustavo F. Padovan struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr)
2041b2a66aadSAntti Julku {
2042b2a66aadSAntti Julku 	struct bdaddr_list *b;
2043b2a66aadSAntti Julku 
20448035ded4SLuiz Augusto von Dentz 	list_for_each_entry(b, &hdev->blacklist, list)
2045b2a66aadSAntti Julku 		if (bacmp(bdaddr, &b->bdaddr) == 0)
2046b2a66aadSAntti Julku 			return b;
2047b2a66aadSAntti Julku 
2048b2a66aadSAntti Julku 	return NULL;
2049b2a66aadSAntti Julku }
2050b2a66aadSAntti Julku 
2051b2a66aadSAntti Julku int hci_blacklist_clear(struct hci_dev *hdev)
2052b2a66aadSAntti Julku {
2053b2a66aadSAntti Julku 	struct list_head *p, *n;
2054b2a66aadSAntti Julku 
2055b2a66aadSAntti Julku 	list_for_each_safe(p, n, &hdev->blacklist) {
2056b2a66aadSAntti Julku 		struct bdaddr_list *b;
2057b2a66aadSAntti Julku 
2058b2a66aadSAntti Julku 		b = list_entry(p, struct bdaddr_list, list);
2059b2a66aadSAntti Julku 
2060b2a66aadSAntti Julku 		list_del(p);
2061b2a66aadSAntti Julku 		kfree(b);
2062b2a66aadSAntti Julku 	}
2063b2a66aadSAntti Julku 
2064b2a66aadSAntti Julku 	return 0;
2065b2a66aadSAntti Julku }
2066b2a66aadSAntti Julku 
206788c1fe4bSJohan Hedberg int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
2068b2a66aadSAntti Julku {
2069b2a66aadSAntti Julku 	struct bdaddr_list *entry;
2070b2a66aadSAntti Julku 
2071b2a66aadSAntti Julku 	if (bacmp(bdaddr, BDADDR_ANY) == 0)
2072b2a66aadSAntti Julku 		return -EBADF;
2073b2a66aadSAntti Julku 
20745e762444SAntti Julku 	if (hci_blacklist_lookup(hdev, bdaddr))
20755e762444SAntti Julku 		return -EEXIST;
2076b2a66aadSAntti Julku 
2077b2a66aadSAntti Julku 	entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
20785e762444SAntti Julku 	if (!entry)
20795e762444SAntti Julku 		return -ENOMEM;
2080b2a66aadSAntti Julku 
2081b2a66aadSAntti Julku 	bacpy(&entry->bdaddr, bdaddr);
2082b2a66aadSAntti Julku 
2083b2a66aadSAntti Julku 	list_add(&entry->list, &hdev->blacklist);
2084b2a66aadSAntti Julku 
208588c1fe4bSJohan Hedberg 	return mgmt_device_blocked(hdev, bdaddr, type);
2086b2a66aadSAntti Julku }
2087b2a66aadSAntti Julku 
208888c1fe4bSJohan Hedberg int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
2089b2a66aadSAntti Julku {
2090b2a66aadSAntti Julku 	struct bdaddr_list *entry;
2091b2a66aadSAntti Julku 
20921ec918ceSSzymon Janc 	if (bacmp(bdaddr, BDADDR_ANY) == 0)
20935e762444SAntti Julku 		return hci_blacklist_clear(hdev);
2094b2a66aadSAntti Julku 
2095b2a66aadSAntti Julku 	entry = hci_blacklist_lookup(hdev, bdaddr);
20961ec918ceSSzymon Janc 	if (!entry)
20975e762444SAntti Julku 		return -ENOENT;
2098b2a66aadSAntti Julku 
2099b2a66aadSAntti Julku 	list_del(&entry->list);
2100b2a66aadSAntti Julku 	kfree(entry);
2101b2a66aadSAntti Julku 
210288c1fe4bSJohan Hedberg 	return mgmt_device_unblocked(hdev, bdaddr, type);
2103b2a66aadSAntti Julku }
2104b2a66aadSAntti Julku 
21054c87eaabSAndre Guedes static void inquiry_complete(struct hci_dev *hdev, u8 status)
21067ba8b4beSAndre Guedes {
21074c87eaabSAndre Guedes 	if (status) {
21084c87eaabSAndre Guedes 		BT_ERR("Failed to start inquiry: status %d", status);
21097ba8b4beSAndre Guedes 
21104c87eaabSAndre Guedes 		hci_dev_lock(hdev);
21114c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
21124c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
21134c87eaabSAndre Guedes 		return;
21144c87eaabSAndre Guedes 	}
21157ba8b4beSAndre Guedes }
21167ba8b4beSAndre Guedes 
21174c87eaabSAndre Guedes static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status)
21187ba8b4beSAndre Guedes {
21194c87eaabSAndre Guedes 	/* General inquiry access code (GIAC) */
21204c87eaabSAndre Guedes 	u8 lap[3] = { 0x33, 0x8b, 0x9e };
21214c87eaabSAndre Guedes 	struct hci_request req;
21224c87eaabSAndre Guedes 	struct hci_cp_inquiry cp;
21237ba8b4beSAndre Guedes 	int err;
21247ba8b4beSAndre Guedes 
21254c87eaabSAndre Guedes 	if (status) {
21264c87eaabSAndre Guedes 		BT_ERR("Failed to disable LE scanning: status %d", status);
21274c87eaabSAndre Guedes 		return;
21287ba8b4beSAndre Guedes 	}
21297ba8b4beSAndre Guedes 
21304c87eaabSAndre Guedes 	switch (hdev->discovery.type) {
21314c87eaabSAndre Guedes 	case DISCOV_TYPE_LE:
21324c87eaabSAndre Guedes 		hci_dev_lock(hdev);
21334c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
21344c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
21354c87eaabSAndre Guedes 		break;
21367dbfac1dSAndre Guedes 
21374c87eaabSAndre Guedes 	case DISCOV_TYPE_INTERLEAVED:
21384c87eaabSAndre Guedes 		hci_req_init(&req, hdev);
21397dbfac1dSAndre Guedes 
21407dbfac1dSAndre Guedes 		memset(&cp, 0, sizeof(cp));
21414c87eaabSAndre Guedes 		memcpy(&cp.lap, lap, sizeof(cp.lap));
21424c87eaabSAndre Guedes 		cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN;
21434c87eaabSAndre Guedes 		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp);
21444c87eaabSAndre Guedes 
21454c87eaabSAndre Guedes 		hci_dev_lock(hdev);
21464c87eaabSAndre Guedes 
21474c87eaabSAndre Guedes 		hci_inquiry_cache_flush(hdev);
21484c87eaabSAndre Guedes 
21494c87eaabSAndre Guedes 		err = hci_req_run(&req, inquiry_complete);
21504c87eaabSAndre Guedes 		if (err) {
21514c87eaabSAndre Guedes 			BT_ERR("Inquiry request failed: err %d", err);
21524c87eaabSAndre Guedes 			hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
21537dbfac1dSAndre Guedes 		}
21547dbfac1dSAndre Guedes 
21554c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
21564c87eaabSAndre Guedes 		break;
21574c87eaabSAndre Guedes 	}
21587dbfac1dSAndre Guedes }
21597dbfac1dSAndre Guedes 
21607ba8b4beSAndre Guedes static void le_scan_disable_work(struct work_struct *work)
21617ba8b4beSAndre Guedes {
21627ba8b4beSAndre Guedes 	struct hci_dev *hdev = container_of(work, struct hci_dev,
21637ba8b4beSAndre Guedes 					    le_scan_disable.work);
21647ba8b4beSAndre Guedes 	struct hci_cp_le_set_scan_enable cp;
21654c87eaabSAndre Guedes 	struct hci_request req;
21664c87eaabSAndre Guedes 	int err;
21677ba8b4beSAndre Guedes 
21687ba8b4beSAndre Guedes 	BT_DBG("%s", hdev->name);
21697ba8b4beSAndre Guedes 
21704c87eaabSAndre Guedes 	hci_req_init(&req, hdev);
21717ba8b4beSAndre Guedes 
21727ba8b4beSAndre Guedes 	memset(&cp, 0, sizeof(cp));
21734c87eaabSAndre Guedes 	cp.enable = LE_SCAN_DISABLE;
21744c87eaabSAndre Guedes 	hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
21757ba8b4beSAndre Guedes 
21764c87eaabSAndre Guedes 	err = hci_req_run(&req, le_scan_disable_work_complete);
21774c87eaabSAndre Guedes 	if (err)
21784c87eaabSAndre Guedes 		BT_ERR("Disable LE scanning request failed: err %d", err);
217928b75a89SAndre Guedes }
218028b75a89SAndre Guedes 
21819be0dab7SDavid Herrmann /* Alloc HCI device */
21829be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void)
21839be0dab7SDavid Herrmann {
21849be0dab7SDavid Herrmann 	struct hci_dev *hdev;
21859be0dab7SDavid Herrmann 
21869be0dab7SDavid Herrmann 	hdev = kzalloc(sizeof(struct hci_dev), GFP_KERNEL);
21879be0dab7SDavid Herrmann 	if (!hdev)
21889be0dab7SDavid Herrmann 		return NULL;
21899be0dab7SDavid Herrmann 
2190b1b813d4SDavid Herrmann 	hdev->pkt_type  = (HCI_DM1 | HCI_DH1 | HCI_HV1);
2191b1b813d4SDavid Herrmann 	hdev->esco_type = (ESCO_HV1);
2192b1b813d4SDavid Herrmann 	hdev->link_mode = (HCI_LM_ACCEPT);
2193b1b813d4SDavid Herrmann 	hdev->io_capability = 0x03; /* No Input No Output */
2194bbaf444aSJohan Hedberg 	hdev->inq_tx_power = HCI_TX_POWER_INVALID;
2195bbaf444aSJohan Hedberg 	hdev->adv_tx_power = HCI_TX_POWER_INVALID;
2196b1b813d4SDavid Herrmann 
2197b1b813d4SDavid Herrmann 	hdev->sniff_max_interval = 800;
2198b1b813d4SDavid Herrmann 	hdev->sniff_min_interval = 80;
2199b1b813d4SDavid Herrmann 
2200b1b813d4SDavid Herrmann 	mutex_init(&hdev->lock);
2201b1b813d4SDavid Herrmann 	mutex_init(&hdev->req_lock);
2202b1b813d4SDavid Herrmann 
2203b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->mgmt_pending);
2204b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->blacklist);
2205b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->uuids);
2206b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->link_keys);
2207b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->long_term_keys);
2208b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->remote_oob_data);
22096b536b5eSAndrei Emeltchenko 	INIT_LIST_HEAD(&hdev->conn_hash.list);
2210b1b813d4SDavid Herrmann 
2211b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->rx_work, hci_rx_work);
2212b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->cmd_work, hci_cmd_work);
2213b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->tx_work, hci_tx_work);
2214b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->power_on, hci_power_on);
2215b1b813d4SDavid Herrmann 
2216b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
2217b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off);
2218b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
2219b1b813d4SDavid Herrmann 
2220b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->rx_q);
2221b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->cmd_q);
2222b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->raw_q);
2223b1b813d4SDavid Herrmann 
2224b1b813d4SDavid Herrmann 	init_waitqueue_head(&hdev->req_wait_q);
2225b1b813d4SDavid Herrmann 
2226bda4f23aSAndrei Emeltchenko 	setup_timer(&hdev->cmd_timer, hci_cmd_timeout, (unsigned long) hdev);
2227b1b813d4SDavid Herrmann 
2228b1b813d4SDavid Herrmann 	hci_init_sysfs(hdev);
2229b1b813d4SDavid Herrmann 	discovery_init(hdev);
22309be0dab7SDavid Herrmann 
22319be0dab7SDavid Herrmann 	return hdev;
22329be0dab7SDavid Herrmann }
22339be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev);
22349be0dab7SDavid Herrmann 
22359be0dab7SDavid Herrmann /* Free HCI device */
22369be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev)
22379be0dab7SDavid Herrmann {
22389be0dab7SDavid Herrmann 	/* will free via device release */
22399be0dab7SDavid Herrmann 	put_device(&hdev->dev);
22409be0dab7SDavid Herrmann }
22419be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev);
22429be0dab7SDavid Herrmann 
22431da177e4SLinus Torvalds /* Register HCI device */
22441da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev)
22451da177e4SLinus Torvalds {
2246b1b813d4SDavid Herrmann 	int id, error;
22471da177e4SLinus Torvalds 
2248010666a1SDavid Herrmann 	if (!hdev->open || !hdev->close)
22491da177e4SLinus Torvalds 		return -EINVAL;
22501da177e4SLinus Torvalds 
225108add513SMat Martineau 	/* Do not allow HCI_AMP devices to register at index 0,
225208add513SMat Martineau 	 * so the index can be used as the AMP controller ID.
225308add513SMat Martineau 	 */
22543df92b31SSasha Levin 	switch (hdev->dev_type) {
22553df92b31SSasha Levin 	case HCI_BREDR:
22563df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL);
22571da177e4SLinus Torvalds 		break;
22583df92b31SSasha Levin 	case HCI_AMP:
22593df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL);
22603df92b31SSasha Levin 		break;
22613df92b31SSasha Levin 	default:
22623df92b31SSasha Levin 		return -EINVAL;
22631da177e4SLinus Torvalds 	}
22641da177e4SLinus Torvalds 
22653df92b31SSasha Levin 	if (id < 0)
22663df92b31SSasha Levin 		return id;
22673df92b31SSasha Levin 
22681da177e4SLinus Torvalds 	sprintf(hdev->name, "hci%d", id);
22691da177e4SLinus Torvalds 	hdev->id = id;
22702d8b3a11SAndrei Emeltchenko 
22712d8b3a11SAndrei Emeltchenko 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
22722d8b3a11SAndrei Emeltchenko 
2273d8537548SKees Cook 	hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
2274d8537548SKees Cook 					  WQ_MEM_RECLAIM, 1, hdev->name);
227533ca954dSDavid Herrmann 	if (!hdev->workqueue) {
227633ca954dSDavid Herrmann 		error = -ENOMEM;
227733ca954dSDavid Herrmann 		goto err;
227833ca954dSDavid Herrmann 	}
2279f48fd9c8SMarcel Holtmann 
2280d8537548SKees Cook 	hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
2281d8537548SKees Cook 					      WQ_MEM_RECLAIM, 1, hdev->name);
22826ead1bbcSJohan Hedberg 	if (!hdev->req_workqueue) {
22836ead1bbcSJohan Hedberg 		destroy_workqueue(hdev->workqueue);
22846ead1bbcSJohan Hedberg 		error = -ENOMEM;
22856ead1bbcSJohan Hedberg 		goto err;
22866ead1bbcSJohan Hedberg 	}
22876ead1bbcSJohan Hedberg 
228833ca954dSDavid Herrmann 	error = hci_add_sysfs(hdev);
228933ca954dSDavid Herrmann 	if (error < 0)
229033ca954dSDavid Herrmann 		goto err_wqueue;
22911da177e4SLinus Torvalds 
2292611b30f7SMarcel Holtmann 	hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev,
2293a8c5fb1aSGustavo Padovan 				    RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops,
2294a8c5fb1aSGustavo Padovan 				    hdev);
2295611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
2296611b30f7SMarcel Holtmann 		if (rfkill_register(hdev->rfkill) < 0) {
2297611b30f7SMarcel Holtmann 			rfkill_destroy(hdev->rfkill);
2298611b30f7SMarcel Holtmann 			hdev->rfkill = NULL;
2299611b30f7SMarcel Holtmann 		}
2300611b30f7SMarcel Holtmann 	}
2301611b30f7SMarcel Holtmann 
23025e130367SJohan Hedberg 	if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
23035e130367SJohan Hedberg 		set_bit(HCI_RFKILLED, &hdev->dev_flags);
23045e130367SJohan Hedberg 
2305a8b2d5c2SJohan Hedberg 	set_bit(HCI_SETUP, &hdev->dev_flags);
2306ce2be9acSAndrei Emeltchenko 
2307ce2be9acSAndrei Emeltchenko 	if (hdev->dev_type != HCI_AMP)
2308ce2be9acSAndrei Emeltchenko 		set_bit(HCI_AUTO_OFF, &hdev->dev_flags);
2309ce2be9acSAndrei Emeltchenko 
2310fcee3377SGustavo Padovan 	write_lock(&hci_dev_list_lock);
2311fcee3377SGustavo Padovan 	list_add(&hdev->list, &hci_dev_list);
2312fcee3377SGustavo Padovan 	write_unlock(&hci_dev_list_lock);
2313fcee3377SGustavo Padovan 
23141da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_REG);
2315dc946bd8SDavid Herrmann 	hci_dev_hold(hdev);
23161da177e4SLinus Torvalds 
231719202573SJohan Hedberg 	queue_work(hdev->req_workqueue, &hdev->power_on);
2318fbe96d6fSMarcel Holtmann 
23191da177e4SLinus Torvalds 	return id;
2320f48fd9c8SMarcel Holtmann 
232133ca954dSDavid Herrmann err_wqueue:
232233ca954dSDavid Herrmann 	destroy_workqueue(hdev->workqueue);
23236ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
232433ca954dSDavid Herrmann err:
23253df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, hdev->id);
2326f48fd9c8SMarcel Holtmann 
232733ca954dSDavid Herrmann 	return error;
23281da177e4SLinus Torvalds }
23291da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev);
23301da177e4SLinus Torvalds 
23311da177e4SLinus Torvalds /* Unregister HCI device */
233259735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev)
23331da177e4SLinus Torvalds {
23343df92b31SSasha Levin 	int i, id;
2335ef222013SMarcel Holtmann 
2336c13854ceSMarcel Holtmann 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
23371da177e4SLinus Torvalds 
233894324962SJohan Hovold 	set_bit(HCI_UNREGISTER, &hdev->dev_flags);
233994324962SJohan Hovold 
23403df92b31SSasha Levin 	id = hdev->id;
23413df92b31SSasha Levin 
2342f20d09d5SGustavo F. Padovan 	write_lock(&hci_dev_list_lock);
23431da177e4SLinus Torvalds 	list_del(&hdev->list);
2344f20d09d5SGustavo F. Padovan 	write_unlock(&hci_dev_list_lock);
23451da177e4SLinus Torvalds 
23461da177e4SLinus Torvalds 	hci_dev_do_close(hdev);
23471da177e4SLinus Torvalds 
2348cd4c5391SSuraj Sumangala 	for (i = 0; i < NUM_REASSEMBLY; i++)
2349ef222013SMarcel Holtmann 		kfree_skb(hdev->reassembly[i]);
2350ef222013SMarcel Holtmann 
2351b9b5ef18SGustavo Padovan 	cancel_work_sync(&hdev->power_on);
2352b9b5ef18SGustavo Padovan 
2353ab81cbf9SJohan Hedberg 	if (!test_bit(HCI_INIT, &hdev->flags) &&
2354a8b2d5c2SJohan Hedberg 	    !test_bit(HCI_SETUP, &hdev->dev_flags)) {
235509fd0de5SGustavo F. Padovan 		hci_dev_lock(hdev);
2356744cf19eSJohan Hedberg 		mgmt_index_removed(hdev);
235709fd0de5SGustavo F. Padovan 		hci_dev_unlock(hdev);
235856e5cb86SJohan Hedberg 	}
2359ab81cbf9SJohan Hedberg 
23602e58ef3eSJohan Hedberg 	/* mgmt_index_removed should take care of emptying the
23612e58ef3eSJohan Hedberg 	 * pending list */
23622e58ef3eSJohan Hedberg 	BUG_ON(!list_empty(&hdev->mgmt_pending));
23632e58ef3eSJohan Hedberg 
23641da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_UNREG);
23651da177e4SLinus Torvalds 
2366611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
2367611b30f7SMarcel Holtmann 		rfkill_unregister(hdev->rfkill);
2368611b30f7SMarcel Holtmann 		rfkill_destroy(hdev->rfkill);
2369611b30f7SMarcel Holtmann 	}
2370611b30f7SMarcel Holtmann 
2371ce242970SDavid Herrmann 	hci_del_sysfs(hdev);
2372147e2d59SDave Young 
2373f48fd9c8SMarcel Holtmann 	destroy_workqueue(hdev->workqueue);
23746ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
2375f48fd9c8SMarcel Holtmann 
237609fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
2377e2e0cacbSJohan Hedberg 	hci_blacklist_clear(hdev);
23782aeb9a1aSJohan Hedberg 	hci_uuids_clear(hdev);
237955ed8ca1SJohan Hedberg 	hci_link_keys_clear(hdev);
2380b899efafSVinicius Costa Gomes 	hci_smp_ltks_clear(hdev);
23812763eda6SSzymon Janc 	hci_remote_oob_data_clear(hdev);
238209fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
2383e2e0cacbSJohan Hedberg 
2384dc946bd8SDavid Herrmann 	hci_dev_put(hdev);
23853df92b31SSasha Levin 
23863df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, id);
23871da177e4SLinus Torvalds }
23881da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev);
23891da177e4SLinus Torvalds 
23901da177e4SLinus Torvalds /* Suspend HCI device */
23911da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev)
23921da177e4SLinus Torvalds {
23931da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_SUSPEND);
23941da177e4SLinus Torvalds 	return 0;
23951da177e4SLinus Torvalds }
23961da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev);
23971da177e4SLinus Torvalds 
23981da177e4SLinus Torvalds /* Resume HCI device */
23991da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev)
24001da177e4SLinus Torvalds {
24011da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_RESUME);
24021da177e4SLinus Torvalds 	return 0;
24031da177e4SLinus Torvalds }
24041da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev);
24051da177e4SLinus Torvalds 
240676bca880SMarcel Holtmann /* Receive frame from HCI drivers */
240776bca880SMarcel Holtmann int hci_recv_frame(struct sk_buff *skb)
240876bca880SMarcel Holtmann {
240976bca880SMarcel Holtmann 	struct hci_dev *hdev = (struct hci_dev *) skb->dev;
241076bca880SMarcel Holtmann 	if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
241176bca880SMarcel Holtmann 		      && !test_bit(HCI_INIT, &hdev->flags))) {
241276bca880SMarcel Holtmann 		kfree_skb(skb);
241376bca880SMarcel Holtmann 		return -ENXIO;
241476bca880SMarcel Holtmann 	}
241576bca880SMarcel Holtmann 
2416d82603c6SJorrit Schippers 	/* Incoming skb */
241776bca880SMarcel Holtmann 	bt_cb(skb)->incoming = 1;
241876bca880SMarcel Holtmann 
241976bca880SMarcel Holtmann 	/* Time stamp */
242076bca880SMarcel Holtmann 	__net_timestamp(skb);
242176bca880SMarcel Holtmann 
242276bca880SMarcel Holtmann 	skb_queue_tail(&hdev->rx_q, skb);
2423b78752ccSMarcel Holtmann 	queue_work(hdev->workqueue, &hdev->rx_work);
2424c78ae283SMarcel Holtmann 
242576bca880SMarcel Holtmann 	return 0;
242676bca880SMarcel Holtmann }
242776bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame);
242876bca880SMarcel Holtmann 
242933e882a5SSuraj Sumangala static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
24301e429f38SGustavo F. Padovan 			  int count, __u8 index)
243133e882a5SSuraj Sumangala {
243233e882a5SSuraj Sumangala 	int len = 0;
243333e882a5SSuraj Sumangala 	int hlen = 0;
243433e882a5SSuraj Sumangala 	int remain = count;
243533e882a5SSuraj Sumangala 	struct sk_buff *skb;
243633e882a5SSuraj Sumangala 	struct bt_skb_cb *scb;
243733e882a5SSuraj Sumangala 
243833e882a5SSuraj Sumangala 	if ((type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT) ||
243933e882a5SSuraj Sumangala 	    index >= NUM_REASSEMBLY)
244033e882a5SSuraj Sumangala 		return -EILSEQ;
244133e882a5SSuraj Sumangala 
244233e882a5SSuraj Sumangala 	skb = hdev->reassembly[index];
244333e882a5SSuraj Sumangala 
244433e882a5SSuraj Sumangala 	if (!skb) {
244533e882a5SSuraj Sumangala 		switch (type) {
244633e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
244733e882a5SSuraj Sumangala 			len = HCI_MAX_FRAME_SIZE;
244833e882a5SSuraj Sumangala 			hlen = HCI_ACL_HDR_SIZE;
244933e882a5SSuraj Sumangala 			break;
245033e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
245133e882a5SSuraj Sumangala 			len = HCI_MAX_EVENT_SIZE;
245233e882a5SSuraj Sumangala 			hlen = HCI_EVENT_HDR_SIZE;
245333e882a5SSuraj Sumangala 			break;
245433e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
245533e882a5SSuraj Sumangala 			len = HCI_MAX_SCO_SIZE;
245633e882a5SSuraj Sumangala 			hlen = HCI_SCO_HDR_SIZE;
245733e882a5SSuraj Sumangala 			break;
245833e882a5SSuraj Sumangala 		}
245933e882a5SSuraj Sumangala 
24601e429f38SGustavo F. Padovan 		skb = bt_skb_alloc(len, GFP_ATOMIC);
246133e882a5SSuraj Sumangala 		if (!skb)
246233e882a5SSuraj Sumangala 			return -ENOMEM;
246333e882a5SSuraj Sumangala 
246433e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
246533e882a5SSuraj Sumangala 		scb->expect = hlen;
246633e882a5SSuraj Sumangala 		scb->pkt_type = type;
246733e882a5SSuraj Sumangala 
246833e882a5SSuraj Sumangala 		skb->dev = (void *) hdev;
246933e882a5SSuraj Sumangala 		hdev->reassembly[index] = skb;
247033e882a5SSuraj Sumangala 	}
247133e882a5SSuraj Sumangala 
247233e882a5SSuraj Sumangala 	while (count) {
247333e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
247489bb46d0SDan Carpenter 		len = min_t(uint, scb->expect, count);
247533e882a5SSuraj Sumangala 
247633e882a5SSuraj Sumangala 		memcpy(skb_put(skb, len), data, len);
247733e882a5SSuraj Sumangala 
247833e882a5SSuraj Sumangala 		count -= len;
247933e882a5SSuraj Sumangala 		data += len;
248033e882a5SSuraj Sumangala 		scb->expect -= len;
248133e882a5SSuraj Sumangala 		remain = count;
248233e882a5SSuraj Sumangala 
248333e882a5SSuraj Sumangala 		switch (type) {
248433e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
248533e882a5SSuraj Sumangala 			if (skb->len == HCI_EVENT_HDR_SIZE) {
248633e882a5SSuraj Sumangala 				struct hci_event_hdr *h = hci_event_hdr(skb);
248733e882a5SSuraj Sumangala 				scb->expect = h->plen;
248833e882a5SSuraj Sumangala 
248933e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
249033e882a5SSuraj Sumangala 					kfree_skb(skb);
249133e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
249233e882a5SSuraj Sumangala 					return -ENOMEM;
249333e882a5SSuraj Sumangala 				}
249433e882a5SSuraj Sumangala 			}
249533e882a5SSuraj Sumangala 			break;
249633e882a5SSuraj Sumangala 
249733e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
249833e882a5SSuraj Sumangala 			if (skb->len  == HCI_ACL_HDR_SIZE) {
249933e882a5SSuraj Sumangala 				struct hci_acl_hdr *h = hci_acl_hdr(skb);
250033e882a5SSuraj Sumangala 				scb->expect = __le16_to_cpu(h->dlen);
250133e882a5SSuraj Sumangala 
250233e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
250333e882a5SSuraj Sumangala 					kfree_skb(skb);
250433e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
250533e882a5SSuraj Sumangala 					return -ENOMEM;
250633e882a5SSuraj Sumangala 				}
250733e882a5SSuraj Sumangala 			}
250833e882a5SSuraj Sumangala 			break;
250933e882a5SSuraj Sumangala 
251033e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
251133e882a5SSuraj Sumangala 			if (skb->len == HCI_SCO_HDR_SIZE) {
251233e882a5SSuraj Sumangala 				struct hci_sco_hdr *h = hci_sco_hdr(skb);
251333e882a5SSuraj Sumangala 				scb->expect = h->dlen;
251433e882a5SSuraj Sumangala 
251533e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
251633e882a5SSuraj Sumangala 					kfree_skb(skb);
251733e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
251833e882a5SSuraj Sumangala 					return -ENOMEM;
251933e882a5SSuraj Sumangala 				}
252033e882a5SSuraj Sumangala 			}
252133e882a5SSuraj Sumangala 			break;
252233e882a5SSuraj Sumangala 		}
252333e882a5SSuraj Sumangala 
252433e882a5SSuraj Sumangala 		if (scb->expect == 0) {
252533e882a5SSuraj Sumangala 			/* Complete frame */
252633e882a5SSuraj Sumangala 
252733e882a5SSuraj Sumangala 			bt_cb(skb)->pkt_type = type;
252833e882a5SSuraj Sumangala 			hci_recv_frame(skb);
252933e882a5SSuraj Sumangala 
253033e882a5SSuraj Sumangala 			hdev->reassembly[index] = NULL;
253133e882a5SSuraj Sumangala 			return remain;
253233e882a5SSuraj Sumangala 		}
253333e882a5SSuraj Sumangala 	}
253433e882a5SSuraj Sumangala 
253533e882a5SSuraj Sumangala 	return remain;
253633e882a5SSuraj Sumangala }
253733e882a5SSuraj Sumangala 
2538ef222013SMarcel Holtmann int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
2539ef222013SMarcel Holtmann {
2540f39a3c06SSuraj Sumangala 	int rem = 0;
2541f39a3c06SSuraj Sumangala 
2542ef222013SMarcel Holtmann 	if (type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT)
2543ef222013SMarcel Holtmann 		return -EILSEQ;
2544ef222013SMarcel Holtmann 
2545da5f6c37SGustavo F. Padovan 	while (count) {
25461e429f38SGustavo F. Padovan 		rem = hci_reassembly(hdev, type, data, count, type - 1);
2547f39a3c06SSuraj Sumangala 		if (rem < 0)
2548f39a3c06SSuraj Sumangala 			return rem;
2549ef222013SMarcel Holtmann 
2550f39a3c06SSuraj Sumangala 		data += (count - rem);
2551f39a3c06SSuraj Sumangala 		count = rem;
2552f81c6224SJoe Perches 	}
2553ef222013SMarcel Holtmann 
2554f39a3c06SSuraj Sumangala 	return rem;
2555ef222013SMarcel Holtmann }
2556ef222013SMarcel Holtmann EXPORT_SYMBOL(hci_recv_fragment);
2557ef222013SMarcel Holtmann 
255899811510SSuraj Sumangala #define STREAM_REASSEMBLY 0
255999811510SSuraj Sumangala 
256099811510SSuraj Sumangala int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count)
256199811510SSuraj Sumangala {
256299811510SSuraj Sumangala 	int type;
256399811510SSuraj Sumangala 	int rem = 0;
256499811510SSuraj Sumangala 
2565da5f6c37SGustavo F. Padovan 	while (count) {
256699811510SSuraj Sumangala 		struct sk_buff *skb = hdev->reassembly[STREAM_REASSEMBLY];
256799811510SSuraj Sumangala 
256899811510SSuraj Sumangala 		if (!skb) {
256999811510SSuraj Sumangala 			struct { char type; } *pkt;
257099811510SSuraj Sumangala 
257199811510SSuraj Sumangala 			/* Start of the frame */
257299811510SSuraj Sumangala 			pkt = data;
257399811510SSuraj Sumangala 			type = pkt->type;
257499811510SSuraj Sumangala 
257599811510SSuraj Sumangala 			data++;
257699811510SSuraj Sumangala 			count--;
257799811510SSuraj Sumangala 		} else
257899811510SSuraj Sumangala 			type = bt_cb(skb)->pkt_type;
257999811510SSuraj Sumangala 
25801e429f38SGustavo F. Padovan 		rem = hci_reassembly(hdev, type, data, count,
25811e429f38SGustavo F. Padovan 				     STREAM_REASSEMBLY);
258299811510SSuraj Sumangala 		if (rem < 0)
258399811510SSuraj Sumangala 			return rem;
258499811510SSuraj Sumangala 
258599811510SSuraj Sumangala 		data += (count - rem);
258699811510SSuraj Sumangala 		count = rem;
2587f81c6224SJoe Perches 	}
258899811510SSuraj Sumangala 
258999811510SSuraj Sumangala 	return rem;
259099811510SSuraj Sumangala }
259199811510SSuraj Sumangala EXPORT_SYMBOL(hci_recv_stream_fragment);
259299811510SSuraj Sumangala 
25931da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */
25941da177e4SLinus Torvalds 
25951da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb)
25961da177e4SLinus Torvalds {
25971da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
25981da177e4SLinus Torvalds 
2599f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
26001da177e4SLinus Torvalds 	list_add(&cb->list, &hci_cb_list);
2601f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
26021da177e4SLinus Torvalds 
26031da177e4SLinus Torvalds 	return 0;
26041da177e4SLinus Torvalds }
26051da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb);
26061da177e4SLinus Torvalds 
26071da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb)
26081da177e4SLinus Torvalds {
26091da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
26101da177e4SLinus Torvalds 
2611f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
26121da177e4SLinus Torvalds 	list_del(&cb->list);
2613f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
26141da177e4SLinus Torvalds 
26151da177e4SLinus Torvalds 	return 0;
26161da177e4SLinus Torvalds }
26171da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb);
26181da177e4SLinus Torvalds 
26191da177e4SLinus Torvalds static int hci_send_frame(struct sk_buff *skb)
26201da177e4SLinus Torvalds {
26211da177e4SLinus Torvalds 	struct hci_dev *hdev = (struct hci_dev *) skb->dev;
26221da177e4SLinus Torvalds 
26231da177e4SLinus Torvalds 	if (!hdev) {
26241da177e4SLinus Torvalds 		kfree_skb(skb);
26251da177e4SLinus Torvalds 		return -ENODEV;
26261da177e4SLinus Torvalds 	}
26271da177e4SLinus Torvalds 
26280d48d939SMarcel Holtmann 	BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
26291da177e4SLinus Torvalds 
26301da177e4SLinus Torvalds 	/* Time stamp */
2631a61bbcf2SPatrick McHardy 	__net_timestamp(skb);
26321da177e4SLinus Torvalds 
2633cd82e61cSMarcel Holtmann 	/* Send copy to monitor */
2634cd82e61cSMarcel Holtmann 	hci_send_to_monitor(hdev, skb);
2635cd82e61cSMarcel Holtmann 
2636cd82e61cSMarcel Holtmann 	if (atomic_read(&hdev->promisc)) {
2637cd82e61cSMarcel Holtmann 		/* Send copy to the sockets */
2638470fe1b5SMarcel Holtmann 		hci_send_to_sock(hdev, skb);
26391da177e4SLinus Torvalds 	}
26401da177e4SLinus Torvalds 
26411da177e4SLinus Torvalds 	/* Get rid of skb owner, prior to sending to the driver. */
26421da177e4SLinus Torvalds 	skb_orphan(skb);
26431da177e4SLinus Torvalds 
26441da177e4SLinus Torvalds 	return hdev->send(skb);
26451da177e4SLinus Torvalds }
26461da177e4SLinus Torvalds 
26473119ae95SJohan Hedberg void hci_req_init(struct hci_request *req, struct hci_dev *hdev)
26483119ae95SJohan Hedberg {
26493119ae95SJohan Hedberg 	skb_queue_head_init(&req->cmd_q);
26503119ae95SJohan Hedberg 	req->hdev = hdev;
26515d73e034SAndre Guedes 	req->err = 0;
26523119ae95SJohan Hedberg }
26533119ae95SJohan Hedberg 
26543119ae95SJohan Hedberg int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
26553119ae95SJohan Hedberg {
26563119ae95SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
26573119ae95SJohan Hedberg 	struct sk_buff *skb;
26583119ae95SJohan Hedberg 	unsigned long flags;
26593119ae95SJohan Hedberg 
26603119ae95SJohan Hedberg 	BT_DBG("length %u", skb_queue_len(&req->cmd_q));
26613119ae95SJohan Hedberg 
26625d73e034SAndre Guedes 	/* If an error occured during request building, remove all HCI
26635d73e034SAndre Guedes 	 * commands queued on the HCI request queue.
26645d73e034SAndre Guedes 	 */
26655d73e034SAndre Guedes 	if (req->err) {
26665d73e034SAndre Guedes 		skb_queue_purge(&req->cmd_q);
26675d73e034SAndre Guedes 		return req->err;
26685d73e034SAndre Guedes 	}
26695d73e034SAndre Guedes 
26703119ae95SJohan Hedberg 	/* Do not allow empty requests */
26713119ae95SJohan Hedberg 	if (skb_queue_empty(&req->cmd_q))
2672382b0c39SAndre Guedes 		return -ENODATA;
26733119ae95SJohan Hedberg 
26743119ae95SJohan Hedberg 	skb = skb_peek_tail(&req->cmd_q);
26753119ae95SJohan Hedberg 	bt_cb(skb)->req.complete = complete;
26763119ae95SJohan Hedberg 
26773119ae95SJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
26783119ae95SJohan Hedberg 	skb_queue_splice_tail(&req->cmd_q, &hdev->cmd_q);
26793119ae95SJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
26803119ae95SJohan Hedberg 
26813119ae95SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
26823119ae95SJohan Hedberg 
26833119ae95SJohan Hedberg 	return 0;
26843119ae95SJohan Hedberg }
26853119ae95SJohan Hedberg 
26861ca3a9d0SJohan Hedberg static struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode,
268707dc93ddSJohan Hedberg 				       u32 plen, const void *param)
26881da177e4SLinus Torvalds {
26891da177e4SLinus Torvalds 	int len = HCI_COMMAND_HDR_SIZE + plen;
26901da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
26911da177e4SLinus Torvalds 	struct sk_buff *skb;
26921da177e4SLinus Torvalds 
26931da177e4SLinus Torvalds 	skb = bt_skb_alloc(len, GFP_ATOMIC);
26941ca3a9d0SJohan Hedberg 	if (!skb)
26951ca3a9d0SJohan Hedberg 		return NULL;
26961da177e4SLinus Torvalds 
26971da177e4SLinus Torvalds 	hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE);
2698a9de9248SMarcel Holtmann 	hdr->opcode = cpu_to_le16(opcode);
26991da177e4SLinus Torvalds 	hdr->plen   = plen;
27001da177e4SLinus Torvalds 
27011da177e4SLinus Torvalds 	if (plen)
27021da177e4SLinus Torvalds 		memcpy(skb_put(skb, plen), param, plen);
27031da177e4SLinus Torvalds 
27041da177e4SLinus Torvalds 	BT_DBG("skb len %d", skb->len);
27051da177e4SLinus Torvalds 
27060d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
27071da177e4SLinus Torvalds 	skb->dev = (void *) hdev;
2708c78ae283SMarcel Holtmann 
27091ca3a9d0SJohan Hedberg 	return skb;
27101ca3a9d0SJohan Hedberg }
27111ca3a9d0SJohan Hedberg 
27121ca3a9d0SJohan Hedberg /* Send HCI command */
271307dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
271407dc93ddSJohan Hedberg 		 const void *param)
27151ca3a9d0SJohan Hedberg {
27161ca3a9d0SJohan Hedberg 	struct sk_buff *skb;
27171ca3a9d0SJohan Hedberg 
27181ca3a9d0SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
27191ca3a9d0SJohan Hedberg 
27201ca3a9d0SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
27211ca3a9d0SJohan Hedberg 	if (!skb) {
27221ca3a9d0SJohan Hedberg 		BT_ERR("%s no memory for command", hdev->name);
27231ca3a9d0SJohan Hedberg 		return -ENOMEM;
27241ca3a9d0SJohan Hedberg 	}
27251ca3a9d0SJohan Hedberg 
272611714b3dSJohan Hedberg 	/* Stand-alone HCI commands must be flaged as
272711714b3dSJohan Hedberg 	 * single-command requests.
272811714b3dSJohan Hedberg 	 */
272911714b3dSJohan Hedberg 	bt_cb(skb)->req.start = true;
273011714b3dSJohan Hedberg 
27311da177e4SLinus Torvalds 	skb_queue_tail(&hdev->cmd_q, skb);
2732c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
27331da177e4SLinus Torvalds 
27341da177e4SLinus Torvalds 	return 0;
27351da177e4SLinus Torvalds }
27361da177e4SLinus Torvalds 
273771c76a17SJohan Hedberg /* Queue a command to an asynchronous HCI request */
273807dc93ddSJohan Hedberg void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
273907dc93ddSJohan Hedberg 		    const void *param, u8 event)
274071c76a17SJohan Hedberg {
274171c76a17SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
274271c76a17SJohan Hedberg 	struct sk_buff *skb;
274371c76a17SJohan Hedberg 
274471c76a17SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
274571c76a17SJohan Hedberg 
274634739c1eSAndre Guedes 	/* If an error occured during request building, there is no point in
274734739c1eSAndre Guedes 	 * queueing the HCI command. We can simply return.
274834739c1eSAndre Guedes 	 */
274934739c1eSAndre Guedes 	if (req->err)
275034739c1eSAndre Guedes 		return;
275134739c1eSAndre Guedes 
275271c76a17SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
275371c76a17SJohan Hedberg 	if (!skb) {
27545d73e034SAndre Guedes 		BT_ERR("%s no memory for command (opcode 0x%4.4x)",
27555d73e034SAndre Guedes 		       hdev->name, opcode);
27565d73e034SAndre Guedes 		req->err = -ENOMEM;
2757e348fe6bSAndre Guedes 		return;
275871c76a17SJohan Hedberg 	}
275971c76a17SJohan Hedberg 
276071c76a17SJohan Hedberg 	if (skb_queue_empty(&req->cmd_q))
276171c76a17SJohan Hedberg 		bt_cb(skb)->req.start = true;
276271c76a17SJohan Hedberg 
276302350a72SJohan Hedberg 	bt_cb(skb)->req.event = event;
276402350a72SJohan Hedberg 
276571c76a17SJohan Hedberg 	skb_queue_tail(&req->cmd_q, skb);
276671c76a17SJohan Hedberg }
276771c76a17SJohan Hedberg 
276807dc93ddSJohan Hedberg void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
276907dc93ddSJohan Hedberg 		 const void *param)
277002350a72SJohan Hedberg {
277102350a72SJohan Hedberg 	hci_req_add_ev(req, opcode, plen, param, 0);
277202350a72SJohan Hedberg }
277302350a72SJohan Hedberg 
27741da177e4SLinus Torvalds /* Get data from the previously sent command */
2775a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
27761da177e4SLinus Torvalds {
27771da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
27781da177e4SLinus Torvalds 
27791da177e4SLinus Torvalds 	if (!hdev->sent_cmd)
27801da177e4SLinus Torvalds 		return NULL;
27811da177e4SLinus Torvalds 
27821da177e4SLinus Torvalds 	hdr = (void *) hdev->sent_cmd->data;
27831da177e4SLinus Torvalds 
2784a9de9248SMarcel Holtmann 	if (hdr->opcode != cpu_to_le16(opcode))
27851da177e4SLinus Torvalds 		return NULL;
27861da177e4SLinus Torvalds 
2787f0e09510SAndrei Emeltchenko 	BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
27881da177e4SLinus Torvalds 
27891da177e4SLinus Torvalds 	return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
27901da177e4SLinus Torvalds }
27911da177e4SLinus Torvalds 
27921da177e4SLinus Torvalds /* Send ACL data */
27931da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags)
27941da177e4SLinus Torvalds {
27951da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr;
27961da177e4SLinus Torvalds 	int len = skb->len;
27971da177e4SLinus Torvalds 
2798badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_ACL_HDR_SIZE);
2799badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
28009c70220bSArnaldo Carvalho de Melo 	hdr = (struct hci_acl_hdr *)skb_transport_header(skb);
2801aca3192cSYOSHIFUJI Hideaki 	hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags));
2802aca3192cSYOSHIFUJI Hideaki 	hdr->dlen   = cpu_to_le16(len);
28031da177e4SLinus Torvalds }
28041da177e4SLinus Torvalds 
2805ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
280673d80debSLuiz Augusto von Dentz 			  struct sk_buff *skb, __u16 flags)
28071da177e4SLinus Torvalds {
2808ee22be7eSAndrei Emeltchenko 	struct hci_conn *conn = chan->conn;
28091da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
28101da177e4SLinus Torvalds 	struct sk_buff *list;
28111da177e4SLinus Torvalds 
2812087bfd99SGustavo Padovan 	skb->len = skb_headlen(skb);
2813087bfd99SGustavo Padovan 	skb->data_len = 0;
2814087bfd99SGustavo Padovan 
2815087bfd99SGustavo Padovan 	bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
2816204a6e54SAndrei Emeltchenko 
2817204a6e54SAndrei Emeltchenko 	switch (hdev->dev_type) {
2818204a6e54SAndrei Emeltchenko 	case HCI_BREDR:
2819087bfd99SGustavo Padovan 		hci_add_acl_hdr(skb, conn->handle, flags);
2820204a6e54SAndrei Emeltchenko 		break;
2821204a6e54SAndrei Emeltchenko 	case HCI_AMP:
2822204a6e54SAndrei Emeltchenko 		hci_add_acl_hdr(skb, chan->handle, flags);
2823204a6e54SAndrei Emeltchenko 		break;
2824204a6e54SAndrei Emeltchenko 	default:
2825204a6e54SAndrei Emeltchenko 		BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
2826204a6e54SAndrei Emeltchenko 		return;
2827204a6e54SAndrei Emeltchenko 	}
2828087bfd99SGustavo Padovan 
282970f23020SAndrei Emeltchenko 	list = skb_shinfo(skb)->frag_list;
283070f23020SAndrei Emeltchenko 	if (!list) {
28311da177e4SLinus Torvalds 		/* Non fragmented */
28321da177e4SLinus Torvalds 		BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len);
28331da177e4SLinus Torvalds 
283473d80debSLuiz Augusto von Dentz 		skb_queue_tail(queue, skb);
28351da177e4SLinus Torvalds 	} else {
28361da177e4SLinus Torvalds 		/* Fragmented */
28371da177e4SLinus Torvalds 		BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
28381da177e4SLinus Torvalds 
28391da177e4SLinus Torvalds 		skb_shinfo(skb)->frag_list = NULL;
28401da177e4SLinus Torvalds 
28411da177e4SLinus Torvalds 		/* Queue all fragments atomically */
2842af3e6359SGustavo F. Padovan 		spin_lock(&queue->lock);
28431da177e4SLinus Torvalds 
284473d80debSLuiz Augusto von Dentz 		__skb_queue_tail(queue, skb);
2845e702112fSAndrei Emeltchenko 
2846e702112fSAndrei Emeltchenko 		flags &= ~ACL_START;
2847e702112fSAndrei Emeltchenko 		flags |= ACL_CONT;
28481da177e4SLinus Torvalds 		do {
28491da177e4SLinus Torvalds 			skb = list; list = list->next;
28501da177e4SLinus Torvalds 
28511da177e4SLinus Torvalds 			skb->dev = (void *) hdev;
28520d48d939SMarcel Holtmann 			bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
2853e702112fSAndrei Emeltchenko 			hci_add_acl_hdr(skb, conn->handle, flags);
28541da177e4SLinus Torvalds 
28551da177e4SLinus Torvalds 			BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
28561da177e4SLinus Torvalds 
285773d80debSLuiz Augusto von Dentz 			__skb_queue_tail(queue, skb);
28581da177e4SLinus Torvalds 		} while (list);
28591da177e4SLinus Torvalds 
2860af3e6359SGustavo F. Padovan 		spin_unlock(&queue->lock);
28611da177e4SLinus Torvalds 	}
286273d80debSLuiz Augusto von Dentz }
286373d80debSLuiz Augusto von Dentz 
286473d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
286573d80debSLuiz Augusto von Dentz {
2866ee22be7eSAndrei Emeltchenko 	struct hci_dev *hdev = chan->conn->hdev;
286773d80debSLuiz Augusto von Dentz 
2868f0e09510SAndrei Emeltchenko 	BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags);
286973d80debSLuiz Augusto von Dentz 
287073d80debSLuiz Augusto von Dentz 	skb->dev = (void *) hdev;
287173d80debSLuiz Augusto von Dentz 
2872ee22be7eSAndrei Emeltchenko 	hci_queue_acl(chan, &chan->data_q, skb, flags);
28731da177e4SLinus Torvalds 
28743eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
28751da177e4SLinus Torvalds }
28761da177e4SLinus Torvalds 
28771da177e4SLinus Torvalds /* Send SCO data */
28780d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
28791da177e4SLinus Torvalds {
28801da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
28811da177e4SLinus Torvalds 	struct hci_sco_hdr hdr;
28821da177e4SLinus Torvalds 
28831da177e4SLinus Torvalds 	BT_DBG("%s len %d", hdev->name, skb->len);
28841da177e4SLinus Torvalds 
2885aca3192cSYOSHIFUJI Hideaki 	hdr.handle = cpu_to_le16(conn->handle);
28861da177e4SLinus Torvalds 	hdr.dlen   = skb->len;
28871da177e4SLinus Torvalds 
2888badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_SCO_HDR_SIZE);
2889badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
28909c70220bSArnaldo Carvalho de Melo 	memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE);
28911da177e4SLinus Torvalds 
28921da177e4SLinus Torvalds 	skb->dev = (void *) hdev;
28930d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_SCODATA_PKT;
2894c78ae283SMarcel Holtmann 
28951da177e4SLinus Torvalds 	skb_queue_tail(&conn->data_q, skb);
28963eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
28971da177e4SLinus Torvalds }
28981da177e4SLinus Torvalds 
28991da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */
29001da177e4SLinus Torvalds 
29011da177e4SLinus Torvalds /* HCI Connection scheduler */
29026039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
2903a8c5fb1aSGustavo Padovan 				     int *quote)
29041da177e4SLinus Torvalds {
29051da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
29068035ded4SLuiz Augusto von Dentz 	struct hci_conn *conn = NULL, *c;
2907abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0;
29081da177e4SLinus Torvalds 
29091da177e4SLinus Torvalds 	/* We don't have to lock device here. Connections are always
29101da177e4SLinus Torvalds 	 * added and removed with TX task disabled. */
2911bf4c6325SGustavo F. Padovan 
2912bf4c6325SGustavo F. Padovan 	rcu_read_lock();
2913bf4c6325SGustavo F. Padovan 
2914bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
2915769be974SMarcel Holtmann 		if (c->type != type || skb_queue_empty(&c->data_q))
29161da177e4SLinus Torvalds 			continue;
2917769be974SMarcel Holtmann 
2918769be974SMarcel Holtmann 		if (c->state != BT_CONNECTED && c->state != BT_CONFIG)
2919769be974SMarcel Holtmann 			continue;
2920769be974SMarcel Holtmann 
29211da177e4SLinus Torvalds 		num++;
29221da177e4SLinus Torvalds 
29231da177e4SLinus Torvalds 		if (c->sent < min) {
29241da177e4SLinus Torvalds 			min  = c->sent;
29251da177e4SLinus Torvalds 			conn = c;
29261da177e4SLinus Torvalds 		}
292752087a79SLuiz Augusto von Dentz 
292852087a79SLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
292952087a79SLuiz Augusto von Dentz 			break;
29301da177e4SLinus Torvalds 	}
29311da177e4SLinus Torvalds 
2932bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
2933bf4c6325SGustavo F. Padovan 
29341da177e4SLinus Torvalds 	if (conn) {
29356ed58ec5SVille Tervo 		int cnt, q;
29366ed58ec5SVille Tervo 
29376ed58ec5SVille Tervo 		switch (conn->type) {
29386ed58ec5SVille Tervo 		case ACL_LINK:
29396ed58ec5SVille Tervo 			cnt = hdev->acl_cnt;
29406ed58ec5SVille Tervo 			break;
29416ed58ec5SVille Tervo 		case SCO_LINK:
29426ed58ec5SVille Tervo 		case ESCO_LINK:
29436ed58ec5SVille Tervo 			cnt = hdev->sco_cnt;
29446ed58ec5SVille Tervo 			break;
29456ed58ec5SVille Tervo 		case LE_LINK:
29466ed58ec5SVille Tervo 			cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
29476ed58ec5SVille Tervo 			break;
29486ed58ec5SVille Tervo 		default:
29496ed58ec5SVille Tervo 			cnt = 0;
29506ed58ec5SVille Tervo 			BT_ERR("Unknown link type");
29516ed58ec5SVille Tervo 		}
29526ed58ec5SVille Tervo 
29536ed58ec5SVille Tervo 		q = cnt / num;
29541da177e4SLinus Torvalds 		*quote = q ? q : 1;
29551da177e4SLinus Torvalds 	} else
29561da177e4SLinus Torvalds 		*quote = 0;
29571da177e4SLinus Torvalds 
29581da177e4SLinus Torvalds 	BT_DBG("conn %p quote %d", conn, *quote);
29591da177e4SLinus Torvalds 	return conn;
29601da177e4SLinus Torvalds }
29611da177e4SLinus Torvalds 
29626039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
29631da177e4SLinus Torvalds {
29641da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
29651da177e4SLinus Torvalds 	struct hci_conn *c;
29661da177e4SLinus Torvalds 
2967bae1f5d9SVille Tervo 	BT_ERR("%s link tx timeout", hdev->name);
29681da177e4SLinus Torvalds 
2969bf4c6325SGustavo F. Padovan 	rcu_read_lock();
2970bf4c6325SGustavo F. Padovan 
29711da177e4SLinus Torvalds 	/* Kill stalled connections */
2972bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
2973bae1f5d9SVille Tervo 		if (c->type == type && c->sent) {
29746ed93dc6SAndrei Emeltchenko 			BT_ERR("%s killing stalled connection %pMR",
29756ed93dc6SAndrei Emeltchenko 			       hdev->name, &c->dst);
2976bed71748SAndre Guedes 			hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
29771da177e4SLinus Torvalds 		}
29781da177e4SLinus Torvalds 	}
2979bf4c6325SGustavo F. Padovan 
2980bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
29811da177e4SLinus Torvalds }
29821da177e4SLinus Torvalds 
29836039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
298473d80debSLuiz Augusto von Dentz 				      int *quote)
298573d80debSLuiz Augusto von Dentz {
298673d80debSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
298773d80debSLuiz Augusto von Dentz 	struct hci_chan *chan = NULL;
2988abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0, cur_prio = 0;
298973d80debSLuiz Augusto von Dentz 	struct hci_conn *conn;
299073d80debSLuiz Augusto von Dentz 	int cnt, q, conn_num = 0;
299173d80debSLuiz Augusto von Dentz 
299273d80debSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
299373d80debSLuiz Augusto von Dentz 
2994bf4c6325SGustavo F. Padovan 	rcu_read_lock();
2995bf4c6325SGustavo F. Padovan 
2996bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
299773d80debSLuiz Augusto von Dentz 		struct hci_chan *tmp;
299873d80debSLuiz Augusto von Dentz 
299973d80debSLuiz Augusto von Dentz 		if (conn->type != type)
300073d80debSLuiz Augusto von Dentz 			continue;
300173d80debSLuiz Augusto von Dentz 
300273d80debSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
300373d80debSLuiz Augusto von Dentz 			continue;
300473d80debSLuiz Augusto von Dentz 
300573d80debSLuiz Augusto von Dentz 		conn_num++;
300673d80debSLuiz Augusto von Dentz 
30078192edefSGustavo F. Padovan 		list_for_each_entry_rcu(tmp, &conn->chan_list, list) {
300873d80debSLuiz Augusto von Dentz 			struct sk_buff *skb;
300973d80debSLuiz Augusto von Dentz 
301073d80debSLuiz Augusto von Dentz 			if (skb_queue_empty(&tmp->data_q))
301173d80debSLuiz Augusto von Dentz 				continue;
301273d80debSLuiz Augusto von Dentz 
301373d80debSLuiz Augusto von Dentz 			skb = skb_peek(&tmp->data_q);
301473d80debSLuiz Augusto von Dentz 			if (skb->priority < cur_prio)
301573d80debSLuiz Augusto von Dentz 				continue;
301673d80debSLuiz Augusto von Dentz 
301773d80debSLuiz Augusto von Dentz 			if (skb->priority > cur_prio) {
301873d80debSLuiz Augusto von Dentz 				num = 0;
301973d80debSLuiz Augusto von Dentz 				min = ~0;
302073d80debSLuiz Augusto von Dentz 				cur_prio = skb->priority;
302173d80debSLuiz Augusto von Dentz 			}
302273d80debSLuiz Augusto von Dentz 
302373d80debSLuiz Augusto von Dentz 			num++;
302473d80debSLuiz Augusto von Dentz 
302573d80debSLuiz Augusto von Dentz 			if (conn->sent < min) {
302673d80debSLuiz Augusto von Dentz 				min  = conn->sent;
302773d80debSLuiz Augusto von Dentz 				chan = tmp;
302873d80debSLuiz Augusto von Dentz 			}
302973d80debSLuiz Augusto von Dentz 		}
303073d80debSLuiz Augusto von Dentz 
303173d80debSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == conn_num)
303273d80debSLuiz Augusto von Dentz 			break;
303373d80debSLuiz Augusto von Dentz 	}
303473d80debSLuiz Augusto von Dentz 
3035bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
3036bf4c6325SGustavo F. Padovan 
303773d80debSLuiz Augusto von Dentz 	if (!chan)
303873d80debSLuiz Augusto von Dentz 		return NULL;
303973d80debSLuiz Augusto von Dentz 
304073d80debSLuiz Augusto von Dentz 	switch (chan->conn->type) {
304173d80debSLuiz Augusto von Dentz 	case ACL_LINK:
304273d80debSLuiz Augusto von Dentz 		cnt = hdev->acl_cnt;
304373d80debSLuiz Augusto von Dentz 		break;
3044bd1eb66bSAndrei Emeltchenko 	case AMP_LINK:
3045bd1eb66bSAndrei Emeltchenko 		cnt = hdev->block_cnt;
3046bd1eb66bSAndrei Emeltchenko 		break;
304773d80debSLuiz Augusto von Dentz 	case SCO_LINK:
304873d80debSLuiz Augusto von Dentz 	case ESCO_LINK:
304973d80debSLuiz Augusto von Dentz 		cnt = hdev->sco_cnt;
305073d80debSLuiz Augusto von Dentz 		break;
305173d80debSLuiz Augusto von Dentz 	case LE_LINK:
305273d80debSLuiz Augusto von Dentz 		cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
305373d80debSLuiz Augusto von Dentz 		break;
305473d80debSLuiz Augusto von Dentz 	default:
305573d80debSLuiz Augusto von Dentz 		cnt = 0;
305673d80debSLuiz Augusto von Dentz 		BT_ERR("Unknown link type");
305773d80debSLuiz Augusto von Dentz 	}
305873d80debSLuiz Augusto von Dentz 
305973d80debSLuiz Augusto von Dentz 	q = cnt / num;
306073d80debSLuiz Augusto von Dentz 	*quote = q ? q : 1;
306173d80debSLuiz Augusto von Dentz 	BT_DBG("chan %p quote %d", chan, *quote);
306273d80debSLuiz Augusto von Dentz 	return chan;
306373d80debSLuiz Augusto von Dentz }
306473d80debSLuiz Augusto von Dentz 
306502b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type)
306602b20f0bSLuiz Augusto von Dentz {
306702b20f0bSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
306802b20f0bSLuiz Augusto von Dentz 	struct hci_conn *conn;
306902b20f0bSLuiz Augusto von Dentz 	int num = 0;
307002b20f0bSLuiz Augusto von Dentz 
307102b20f0bSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
307202b20f0bSLuiz Augusto von Dentz 
3073bf4c6325SGustavo F. Padovan 	rcu_read_lock();
3074bf4c6325SGustavo F. Padovan 
3075bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
307602b20f0bSLuiz Augusto von Dentz 		struct hci_chan *chan;
307702b20f0bSLuiz Augusto von Dentz 
307802b20f0bSLuiz Augusto von Dentz 		if (conn->type != type)
307902b20f0bSLuiz Augusto von Dentz 			continue;
308002b20f0bSLuiz Augusto von Dentz 
308102b20f0bSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
308202b20f0bSLuiz Augusto von Dentz 			continue;
308302b20f0bSLuiz Augusto von Dentz 
308402b20f0bSLuiz Augusto von Dentz 		num++;
308502b20f0bSLuiz Augusto von Dentz 
30868192edefSGustavo F. Padovan 		list_for_each_entry_rcu(chan, &conn->chan_list, list) {
308702b20f0bSLuiz Augusto von Dentz 			struct sk_buff *skb;
308802b20f0bSLuiz Augusto von Dentz 
308902b20f0bSLuiz Augusto von Dentz 			if (chan->sent) {
309002b20f0bSLuiz Augusto von Dentz 				chan->sent = 0;
309102b20f0bSLuiz Augusto von Dentz 				continue;
309202b20f0bSLuiz Augusto von Dentz 			}
309302b20f0bSLuiz Augusto von Dentz 
309402b20f0bSLuiz Augusto von Dentz 			if (skb_queue_empty(&chan->data_q))
309502b20f0bSLuiz Augusto von Dentz 				continue;
309602b20f0bSLuiz Augusto von Dentz 
309702b20f0bSLuiz Augusto von Dentz 			skb = skb_peek(&chan->data_q);
309802b20f0bSLuiz Augusto von Dentz 			if (skb->priority >= HCI_PRIO_MAX - 1)
309902b20f0bSLuiz Augusto von Dentz 				continue;
310002b20f0bSLuiz Augusto von Dentz 
310102b20f0bSLuiz Augusto von Dentz 			skb->priority = HCI_PRIO_MAX - 1;
310202b20f0bSLuiz Augusto von Dentz 
310302b20f0bSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p promoted to %d", chan, skb,
310402b20f0bSLuiz Augusto von Dentz 			       skb->priority);
310502b20f0bSLuiz Augusto von Dentz 		}
310602b20f0bSLuiz Augusto von Dentz 
310702b20f0bSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
310802b20f0bSLuiz Augusto von Dentz 			break;
310902b20f0bSLuiz Augusto von Dentz 	}
3110bf4c6325SGustavo F. Padovan 
3111bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
3112bf4c6325SGustavo F. Padovan 
311302b20f0bSLuiz Augusto von Dentz }
311402b20f0bSLuiz Augusto von Dentz 
3115b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb)
3116b71d385aSAndrei Emeltchenko {
3117b71d385aSAndrei Emeltchenko 	/* Calculate count of blocks used by this packet */
3118b71d385aSAndrei Emeltchenko 	return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len);
3119b71d385aSAndrei Emeltchenko }
3120b71d385aSAndrei Emeltchenko 
31216039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt)
31221da177e4SLinus Torvalds {
31231da177e4SLinus Torvalds 	if (!test_bit(HCI_RAW, &hdev->flags)) {
31241da177e4SLinus Torvalds 		/* ACL tx timeout must be longer than maximum
31251da177e4SLinus Torvalds 		 * link supervision timeout (40.9 seconds) */
312663d2bc1bSAndrei Emeltchenko 		if (!cnt && time_after(jiffies, hdev->acl_last_tx +
31275f246e89SAndrei Emeltchenko 				       HCI_ACL_TX_TIMEOUT))
3128bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, ACL_LINK);
31291da177e4SLinus Torvalds 	}
313063d2bc1bSAndrei Emeltchenko }
31311da177e4SLinus Torvalds 
31326039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev)
313363d2bc1bSAndrei Emeltchenko {
313463d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->acl_cnt;
313563d2bc1bSAndrei Emeltchenko 	struct hci_chan *chan;
313663d2bc1bSAndrei Emeltchenko 	struct sk_buff *skb;
313763d2bc1bSAndrei Emeltchenko 	int quote;
313863d2bc1bSAndrei Emeltchenko 
313963d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
314004837f64SMarcel Holtmann 
314173d80debSLuiz Augusto von Dentz 	while (hdev->acl_cnt &&
314273d80debSLuiz Augusto von Dentz 	       (chan = hci_chan_sent(hdev, ACL_LINK, &quote))) {
3143ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
3144ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
314573d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
314673d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
314773d80debSLuiz Augusto von Dentz 
3148ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
3149ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
3150ec1cce24SLuiz Augusto von Dentz 				break;
3151ec1cce24SLuiz Augusto von Dentz 
3152ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
3153ec1cce24SLuiz Augusto von Dentz 
315473d80debSLuiz Augusto von Dentz 			hci_conn_enter_active_mode(chan->conn,
315573d80debSLuiz Augusto von Dentz 						   bt_cb(skb)->force_active);
315604837f64SMarcel Holtmann 
31571da177e4SLinus Torvalds 			hci_send_frame(skb);
31581da177e4SLinus Torvalds 			hdev->acl_last_tx = jiffies;
31591da177e4SLinus Torvalds 
31601da177e4SLinus Torvalds 			hdev->acl_cnt--;
316173d80debSLuiz Augusto von Dentz 			chan->sent++;
316273d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
31631da177e4SLinus Torvalds 		}
31641da177e4SLinus Torvalds 	}
316502b20f0bSLuiz Augusto von Dentz 
316602b20f0bSLuiz Augusto von Dentz 	if (cnt != hdev->acl_cnt)
316702b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, ACL_LINK);
31681da177e4SLinus Torvalds }
31691da177e4SLinus Torvalds 
31706039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev)
3171b71d385aSAndrei Emeltchenko {
317263d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->block_cnt;
3173b71d385aSAndrei Emeltchenko 	struct hci_chan *chan;
3174b71d385aSAndrei Emeltchenko 	struct sk_buff *skb;
3175b71d385aSAndrei Emeltchenko 	int quote;
3176bd1eb66bSAndrei Emeltchenko 	u8 type;
3177b71d385aSAndrei Emeltchenko 
317863d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
3179b71d385aSAndrei Emeltchenko 
3180bd1eb66bSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
3181bd1eb66bSAndrei Emeltchenko 
3182bd1eb66bSAndrei Emeltchenko 	if (hdev->dev_type == HCI_AMP)
3183bd1eb66bSAndrei Emeltchenko 		type = AMP_LINK;
3184bd1eb66bSAndrei Emeltchenko 	else
3185bd1eb66bSAndrei Emeltchenko 		type = ACL_LINK;
3186bd1eb66bSAndrei Emeltchenko 
3187b71d385aSAndrei Emeltchenko 	while (hdev->block_cnt > 0 &&
3188bd1eb66bSAndrei Emeltchenko 	       (chan = hci_chan_sent(hdev, type, &quote))) {
3189b71d385aSAndrei Emeltchenko 		u32 priority = (skb_peek(&chan->data_q))->priority;
3190b71d385aSAndrei Emeltchenko 		while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
3191b71d385aSAndrei Emeltchenko 			int blocks;
3192b71d385aSAndrei Emeltchenko 
3193b71d385aSAndrei Emeltchenko 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
3194b71d385aSAndrei Emeltchenko 			       skb->len, skb->priority);
3195b71d385aSAndrei Emeltchenko 
3196b71d385aSAndrei Emeltchenko 			/* Stop if priority has changed */
3197b71d385aSAndrei Emeltchenko 			if (skb->priority < priority)
3198b71d385aSAndrei Emeltchenko 				break;
3199b71d385aSAndrei Emeltchenko 
3200b71d385aSAndrei Emeltchenko 			skb = skb_dequeue(&chan->data_q);
3201b71d385aSAndrei Emeltchenko 
3202b71d385aSAndrei Emeltchenko 			blocks = __get_blocks(hdev, skb);
3203b71d385aSAndrei Emeltchenko 			if (blocks > hdev->block_cnt)
3204b71d385aSAndrei Emeltchenko 				return;
3205b71d385aSAndrei Emeltchenko 
3206b71d385aSAndrei Emeltchenko 			hci_conn_enter_active_mode(chan->conn,
3207b71d385aSAndrei Emeltchenko 						   bt_cb(skb)->force_active);
3208b71d385aSAndrei Emeltchenko 
3209b71d385aSAndrei Emeltchenko 			hci_send_frame(skb);
3210b71d385aSAndrei Emeltchenko 			hdev->acl_last_tx = jiffies;
3211b71d385aSAndrei Emeltchenko 
3212b71d385aSAndrei Emeltchenko 			hdev->block_cnt -= blocks;
3213b71d385aSAndrei Emeltchenko 			quote -= blocks;
3214b71d385aSAndrei Emeltchenko 
3215b71d385aSAndrei Emeltchenko 			chan->sent += blocks;
3216b71d385aSAndrei Emeltchenko 			chan->conn->sent += blocks;
3217b71d385aSAndrei Emeltchenko 		}
3218b71d385aSAndrei Emeltchenko 	}
3219b71d385aSAndrei Emeltchenko 
3220b71d385aSAndrei Emeltchenko 	if (cnt != hdev->block_cnt)
3221bd1eb66bSAndrei Emeltchenko 		hci_prio_recalculate(hdev, type);
3222b71d385aSAndrei Emeltchenko }
3223b71d385aSAndrei Emeltchenko 
32246039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev)
3225b71d385aSAndrei Emeltchenko {
3226b71d385aSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
3227b71d385aSAndrei Emeltchenko 
3228bd1eb66bSAndrei Emeltchenko 	/* No ACL link over BR/EDR controller */
3229bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR)
3230bd1eb66bSAndrei Emeltchenko 		return;
3231bd1eb66bSAndrei Emeltchenko 
3232bd1eb66bSAndrei Emeltchenko 	/* No AMP link over AMP controller */
3233bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
3234b71d385aSAndrei Emeltchenko 		return;
3235b71d385aSAndrei Emeltchenko 
3236b71d385aSAndrei Emeltchenko 	switch (hdev->flow_ctl_mode) {
3237b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_PACKET_BASED:
3238b71d385aSAndrei Emeltchenko 		hci_sched_acl_pkt(hdev);
3239b71d385aSAndrei Emeltchenko 		break;
3240b71d385aSAndrei Emeltchenko 
3241b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_BLOCK_BASED:
3242b71d385aSAndrei Emeltchenko 		hci_sched_acl_blk(hdev);
3243b71d385aSAndrei Emeltchenko 		break;
3244b71d385aSAndrei Emeltchenko 	}
3245b71d385aSAndrei Emeltchenko }
3246b71d385aSAndrei Emeltchenko 
32471da177e4SLinus Torvalds /* Schedule SCO */
32486039aa73SGustavo Padovan static void hci_sched_sco(struct hci_dev *hdev)
32491da177e4SLinus Torvalds {
32501da177e4SLinus Torvalds 	struct hci_conn *conn;
32511da177e4SLinus Torvalds 	struct sk_buff *skb;
32521da177e4SLinus Torvalds 	int quote;
32531da177e4SLinus Torvalds 
32541da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
32551da177e4SLinus Torvalds 
325652087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, SCO_LINK))
325752087a79SLuiz Augusto von Dentz 		return;
325852087a79SLuiz Augusto von Dentz 
32591da177e4SLinus Torvalds 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, &quote))) {
32601da177e4SLinus Torvalds 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
32611da177e4SLinus Torvalds 			BT_DBG("skb %p len %d", skb, skb->len);
32621da177e4SLinus Torvalds 			hci_send_frame(skb);
32631da177e4SLinus Torvalds 
32641da177e4SLinus Torvalds 			conn->sent++;
32651da177e4SLinus Torvalds 			if (conn->sent == ~0)
32661da177e4SLinus Torvalds 				conn->sent = 0;
32671da177e4SLinus Torvalds 		}
32681da177e4SLinus Torvalds 	}
32691da177e4SLinus Torvalds }
32701da177e4SLinus Torvalds 
32716039aa73SGustavo Padovan static void hci_sched_esco(struct hci_dev *hdev)
3272b6a0dc82SMarcel Holtmann {
3273b6a0dc82SMarcel Holtmann 	struct hci_conn *conn;
3274b6a0dc82SMarcel Holtmann 	struct sk_buff *skb;
3275b6a0dc82SMarcel Holtmann 	int quote;
3276b6a0dc82SMarcel Holtmann 
3277b6a0dc82SMarcel Holtmann 	BT_DBG("%s", hdev->name);
3278b6a0dc82SMarcel Holtmann 
327952087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, ESCO_LINK))
328052087a79SLuiz Augusto von Dentz 		return;
328152087a79SLuiz Augusto von Dentz 
32828fc9ced3SGustavo Padovan 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK,
32838fc9ced3SGustavo Padovan 						     &quote))) {
3284b6a0dc82SMarcel Holtmann 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
3285b6a0dc82SMarcel Holtmann 			BT_DBG("skb %p len %d", skb, skb->len);
3286b6a0dc82SMarcel Holtmann 			hci_send_frame(skb);
3287b6a0dc82SMarcel Holtmann 
3288b6a0dc82SMarcel Holtmann 			conn->sent++;
3289b6a0dc82SMarcel Holtmann 			if (conn->sent == ~0)
3290b6a0dc82SMarcel Holtmann 				conn->sent = 0;
3291b6a0dc82SMarcel Holtmann 		}
3292b6a0dc82SMarcel Holtmann 	}
3293b6a0dc82SMarcel Holtmann }
3294b6a0dc82SMarcel Holtmann 
32956039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev)
32966ed58ec5SVille Tervo {
329773d80debSLuiz Augusto von Dentz 	struct hci_chan *chan;
32986ed58ec5SVille Tervo 	struct sk_buff *skb;
329902b20f0bSLuiz Augusto von Dentz 	int quote, cnt, tmp;
33006ed58ec5SVille Tervo 
33016ed58ec5SVille Tervo 	BT_DBG("%s", hdev->name);
33026ed58ec5SVille Tervo 
330352087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, LE_LINK))
330452087a79SLuiz Augusto von Dentz 		return;
330552087a79SLuiz Augusto von Dentz 
33066ed58ec5SVille Tervo 	if (!test_bit(HCI_RAW, &hdev->flags)) {
33076ed58ec5SVille Tervo 		/* LE tx timeout must be longer than maximum
33086ed58ec5SVille Tervo 		 * link supervision timeout (40.9 seconds) */
3309bae1f5d9SVille Tervo 		if (!hdev->le_cnt && hdev->le_pkts &&
33106ed58ec5SVille Tervo 		    time_after(jiffies, hdev->le_last_tx + HZ * 45))
3311bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, LE_LINK);
33126ed58ec5SVille Tervo 	}
33136ed58ec5SVille Tervo 
33146ed58ec5SVille Tervo 	cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
331502b20f0bSLuiz Augusto von Dentz 	tmp = cnt;
331673d80debSLuiz Augusto von Dentz 	while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, &quote))) {
3317ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
3318ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
331973d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
332073d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
33216ed58ec5SVille Tervo 
3322ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
3323ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
3324ec1cce24SLuiz Augusto von Dentz 				break;
3325ec1cce24SLuiz Augusto von Dentz 
3326ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
3327ec1cce24SLuiz Augusto von Dentz 
33286ed58ec5SVille Tervo 			hci_send_frame(skb);
33296ed58ec5SVille Tervo 			hdev->le_last_tx = jiffies;
33306ed58ec5SVille Tervo 
33316ed58ec5SVille Tervo 			cnt--;
333273d80debSLuiz Augusto von Dentz 			chan->sent++;
333373d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
33346ed58ec5SVille Tervo 		}
33356ed58ec5SVille Tervo 	}
333673d80debSLuiz Augusto von Dentz 
33376ed58ec5SVille Tervo 	if (hdev->le_pkts)
33386ed58ec5SVille Tervo 		hdev->le_cnt = cnt;
33396ed58ec5SVille Tervo 	else
33406ed58ec5SVille Tervo 		hdev->acl_cnt = cnt;
334102b20f0bSLuiz Augusto von Dentz 
334202b20f0bSLuiz Augusto von Dentz 	if (cnt != tmp)
334302b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, LE_LINK);
33446ed58ec5SVille Tervo }
33456ed58ec5SVille Tervo 
33463eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work)
33471da177e4SLinus Torvalds {
33483eff45eaSGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work);
33491da177e4SLinus Torvalds 	struct sk_buff *skb;
33501da177e4SLinus Torvalds 
33516ed58ec5SVille Tervo 	BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt,
33526ed58ec5SVille Tervo 	       hdev->sco_cnt, hdev->le_cnt);
33531da177e4SLinus Torvalds 
335452de599eSMarcel Holtmann 	if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
33551da177e4SLinus Torvalds 		/* Schedule queues and send stuff to HCI driver */
33561da177e4SLinus Torvalds 		hci_sched_acl(hdev);
33571da177e4SLinus Torvalds 		hci_sched_sco(hdev);
3358b6a0dc82SMarcel Holtmann 		hci_sched_esco(hdev);
33596ed58ec5SVille Tervo 		hci_sched_le(hdev);
336052de599eSMarcel Holtmann 	}
33616ed58ec5SVille Tervo 
33621da177e4SLinus Torvalds 	/* Send next queued raw (unknown type) packet */
33631da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->raw_q)))
33641da177e4SLinus Torvalds 		hci_send_frame(skb);
33651da177e4SLinus Torvalds }
33661da177e4SLinus Torvalds 
336725985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */
33681da177e4SLinus Torvalds 
33691da177e4SLinus Torvalds /* ACL data packet */
33706039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
33711da177e4SLinus Torvalds {
33721da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr = (void *) skb->data;
33731da177e4SLinus Torvalds 	struct hci_conn *conn;
33741da177e4SLinus Torvalds 	__u16 handle, flags;
33751da177e4SLinus Torvalds 
33761da177e4SLinus Torvalds 	skb_pull(skb, HCI_ACL_HDR_SIZE);
33771da177e4SLinus Torvalds 
33781da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
33791da177e4SLinus Torvalds 	flags  = hci_flags(handle);
33801da177e4SLinus Torvalds 	handle = hci_handle(handle);
33811da177e4SLinus Torvalds 
3382f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
3383a8c5fb1aSGustavo Padovan 	       handle, flags);
33841da177e4SLinus Torvalds 
33851da177e4SLinus Torvalds 	hdev->stat.acl_rx++;
33861da177e4SLinus Torvalds 
33871da177e4SLinus Torvalds 	hci_dev_lock(hdev);
33881da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
33891da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
33901da177e4SLinus Torvalds 
33911da177e4SLinus Torvalds 	if (conn) {
339265983fc7SMat Martineau 		hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
339304837f64SMarcel Holtmann 
33941da177e4SLinus Torvalds 		/* Send to upper protocol */
3395686ebf28SUlisses Furquim 		l2cap_recv_acldata(conn, skb, flags);
33961da177e4SLinus Torvalds 		return;
33971da177e4SLinus Torvalds 	} else {
33981da177e4SLinus Torvalds 		BT_ERR("%s ACL packet for unknown connection handle %d",
33991da177e4SLinus Torvalds 		       hdev->name, handle);
34001da177e4SLinus Torvalds 	}
34011da177e4SLinus Torvalds 
34021da177e4SLinus Torvalds 	kfree_skb(skb);
34031da177e4SLinus Torvalds }
34041da177e4SLinus Torvalds 
34051da177e4SLinus Torvalds /* SCO data packet */
34066039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
34071da177e4SLinus Torvalds {
34081da177e4SLinus Torvalds 	struct hci_sco_hdr *hdr = (void *) skb->data;
34091da177e4SLinus Torvalds 	struct hci_conn *conn;
34101da177e4SLinus Torvalds 	__u16 handle;
34111da177e4SLinus Torvalds 
34121da177e4SLinus Torvalds 	skb_pull(skb, HCI_SCO_HDR_SIZE);
34131da177e4SLinus Torvalds 
34141da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
34151da177e4SLinus Torvalds 
3416f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle);
34171da177e4SLinus Torvalds 
34181da177e4SLinus Torvalds 	hdev->stat.sco_rx++;
34191da177e4SLinus Torvalds 
34201da177e4SLinus Torvalds 	hci_dev_lock(hdev);
34211da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
34221da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
34231da177e4SLinus Torvalds 
34241da177e4SLinus Torvalds 	if (conn) {
34251da177e4SLinus Torvalds 		/* Send to upper protocol */
3426686ebf28SUlisses Furquim 		sco_recv_scodata(conn, skb);
34271da177e4SLinus Torvalds 		return;
34281da177e4SLinus Torvalds 	} else {
34291da177e4SLinus Torvalds 		BT_ERR("%s SCO packet for unknown connection handle %d",
34301da177e4SLinus Torvalds 		       hdev->name, handle);
34311da177e4SLinus Torvalds 	}
34321da177e4SLinus Torvalds 
34331da177e4SLinus Torvalds 	kfree_skb(skb);
34341da177e4SLinus Torvalds }
34351da177e4SLinus Torvalds 
34369238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev)
34379238f36aSJohan Hedberg {
34389238f36aSJohan Hedberg 	struct sk_buff *skb;
34399238f36aSJohan Hedberg 
34409238f36aSJohan Hedberg 	skb = skb_peek(&hdev->cmd_q);
34419238f36aSJohan Hedberg 	if (!skb)
34429238f36aSJohan Hedberg 		return true;
34439238f36aSJohan Hedberg 
34449238f36aSJohan Hedberg 	return bt_cb(skb)->req.start;
34459238f36aSJohan Hedberg }
34469238f36aSJohan Hedberg 
344742c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev)
344842c6b129SJohan Hedberg {
344942c6b129SJohan Hedberg 	struct hci_command_hdr *sent;
345042c6b129SJohan Hedberg 	struct sk_buff *skb;
345142c6b129SJohan Hedberg 	u16 opcode;
345242c6b129SJohan Hedberg 
345342c6b129SJohan Hedberg 	if (!hdev->sent_cmd)
345442c6b129SJohan Hedberg 		return;
345542c6b129SJohan Hedberg 
345642c6b129SJohan Hedberg 	sent = (void *) hdev->sent_cmd->data;
345742c6b129SJohan Hedberg 	opcode = __le16_to_cpu(sent->opcode);
345842c6b129SJohan Hedberg 	if (opcode == HCI_OP_RESET)
345942c6b129SJohan Hedberg 		return;
346042c6b129SJohan Hedberg 
346142c6b129SJohan Hedberg 	skb = skb_clone(hdev->sent_cmd, GFP_KERNEL);
346242c6b129SJohan Hedberg 	if (!skb)
346342c6b129SJohan Hedberg 		return;
346442c6b129SJohan Hedberg 
346542c6b129SJohan Hedberg 	skb_queue_head(&hdev->cmd_q, skb);
346642c6b129SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
346742c6b129SJohan Hedberg }
346842c6b129SJohan Hedberg 
34699238f36aSJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status)
34709238f36aSJohan Hedberg {
34719238f36aSJohan Hedberg 	hci_req_complete_t req_complete = NULL;
34729238f36aSJohan Hedberg 	struct sk_buff *skb;
34739238f36aSJohan Hedberg 	unsigned long flags;
34749238f36aSJohan Hedberg 
34759238f36aSJohan Hedberg 	BT_DBG("opcode 0x%04x status 0x%02x", opcode, status);
34769238f36aSJohan Hedberg 
347742c6b129SJohan Hedberg 	/* If the completed command doesn't match the last one that was
347842c6b129SJohan Hedberg 	 * sent we need to do special handling of it.
34799238f36aSJohan Hedberg 	 */
348042c6b129SJohan Hedberg 	if (!hci_sent_cmd_data(hdev, opcode)) {
348142c6b129SJohan Hedberg 		/* Some CSR based controllers generate a spontaneous
348242c6b129SJohan Hedberg 		 * reset complete event during init and any pending
348342c6b129SJohan Hedberg 		 * command will never be completed. In such a case we
348442c6b129SJohan Hedberg 		 * need to resend whatever was the last sent
348542c6b129SJohan Hedberg 		 * command.
348642c6b129SJohan Hedberg 		 */
348742c6b129SJohan Hedberg 		if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET)
348842c6b129SJohan Hedberg 			hci_resend_last(hdev);
348942c6b129SJohan Hedberg 
34909238f36aSJohan Hedberg 		return;
349142c6b129SJohan Hedberg 	}
34929238f36aSJohan Hedberg 
34939238f36aSJohan Hedberg 	/* If the command succeeded and there's still more commands in
34949238f36aSJohan Hedberg 	 * this request the request is not yet complete.
34959238f36aSJohan Hedberg 	 */
34969238f36aSJohan Hedberg 	if (!status && !hci_req_is_complete(hdev))
34979238f36aSJohan Hedberg 		return;
34989238f36aSJohan Hedberg 
34999238f36aSJohan Hedberg 	/* If this was the last command in a request the complete
35009238f36aSJohan Hedberg 	 * callback would be found in hdev->sent_cmd instead of the
35019238f36aSJohan Hedberg 	 * command queue (hdev->cmd_q).
35029238f36aSJohan Hedberg 	 */
35039238f36aSJohan Hedberg 	if (hdev->sent_cmd) {
35049238f36aSJohan Hedberg 		req_complete = bt_cb(hdev->sent_cmd)->req.complete;
350553e21fbcSJohan Hedberg 
350653e21fbcSJohan Hedberg 		if (req_complete) {
350753e21fbcSJohan Hedberg 			/* We must set the complete callback to NULL to
350853e21fbcSJohan Hedberg 			 * avoid calling the callback more than once if
350953e21fbcSJohan Hedberg 			 * this function gets called again.
351053e21fbcSJohan Hedberg 			 */
351153e21fbcSJohan Hedberg 			bt_cb(hdev->sent_cmd)->req.complete = NULL;
351253e21fbcSJohan Hedberg 
35139238f36aSJohan Hedberg 			goto call_complete;
35149238f36aSJohan Hedberg 		}
351553e21fbcSJohan Hedberg 	}
35169238f36aSJohan Hedberg 
35179238f36aSJohan Hedberg 	/* Remove all pending commands belonging to this request */
35189238f36aSJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
35199238f36aSJohan Hedberg 	while ((skb = __skb_dequeue(&hdev->cmd_q))) {
35209238f36aSJohan Hedberg 		if (bt_cb(skb)->req.start) {
35219238f36aSJohan Hedberg 			__skb_queue_head(&hdev->cmd_q, skb);
35229238f36aSJohan Hedberg 			break;
35239238f36aSJohan Hedberg 		}
35249238f36aSJohan Hedberg 
35259238f36aSJohan Hedberg 		req_complete = bt_cb(skb)->req.complete;
35269238f36aSJohan Hedberg 		kfree_skb(skb);
35279238f36aSJohan Hedberg 	}
35289238f36aSJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
35299238f36aSJohan Hedberg 
35309238f36aSJohan Hedberg call_complete:
35319238f36aSJohan Hedberg 	if (req_complete)
35329238f36aSJohan Hedberg 		req_complete(hdev, status);
35339238f36aSJohan Hedberg }
35349238f36aSJohan Hedberg 
3535b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work)
35361da177e4SLinus Torvalds {
3537b78752ccSMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work);
35381da177e4SLinus Torvalds 	struct sk_buff *skb;
35391da177e4SLinus Torvalds 
35401da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
35411da177e4SLinus Torvalds 
35421da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->rx_q))) {
3543cd82e61cSMarcel Holtmann 		/* Send copy to monitor */
3544cd82e61cSMarcel Holtmann 		hci_send_to_monitor(hdev, skb);
3545cd82e61cSMarcel Holtmann 
35461da177e4SLinus Torvalds 		if (atomic_read(&hdev->promisc)) {
35471da177e4SLinus Torvalds 			/* Send copy to the sockets */
3548470fe1b5SMarcel Holtmann 			hci_send_to_sock(hdev, skb);
35491da177e4SLinus Torvalds 		}
35501da177e4SLinus Torvalds 
35510736cfa8SMarcel Holtmann 		if (test_bit(HCI_RAW, &hdev->flags) ||
35520736cfa8SMarcel Holtmann 		    test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
35531da177e4SLinus Torvalds 			kfree_skb(skb);
35541da177e4SLinus Torvalds 			continue;
35551da177e4SLinus Torvalds 		}
35561da177e4SLinus Torvalds 
35571da177e4SLinus Torvalds 		if (test_bit(HCI_INIT, &hdev->flags)) {
35581da177e4SLinus Torvalds 			/* Don't process data packets in this states. */
35590d48d939SMarcel Holtmann 			switch (bt_cb(skb)->pkt_type) {
35601da177e4SLinus Torvalds 			case HCI_ACLDATA_PKT:
35611da177e4SLinus Torvalds 			case HCI_SCODATA_PKT:
35621da177e4SLinus Torvalds 				kfree_skb(skb);
35631da177e4SLinus Torvalds 				continue;
35643ff50b79SStephen Hemminger 			}
35651da177e4SLinus Torvalds 		}
35661da177e4SLinus Torvalds 
35671da177e4SLinus Torvalds 		/* Process frame */
35680d48d939SMarcel Holtmann 		switch (bt_cb(skb)->pkt_type) {
35691da177e4SLinus Torvalds 		case HCI_EVENT_PKT:
3570b78752ccSMarcel Holtmann 			BT_DBG("%s Event packet", hdev->name);
35711da177e4SLinus Torvalds 			hci_event_packet(hdev, skb);
35721da177e4SLinus Torvalds 			break;
35731da177e4SLinus Torvalds 
35741da177e4SLinus Torvalds 		case HCI_ACLDATA_PKT:
35751da177e4SLinus Torvalds 			BT_DBG("%s ACL data packet", hdev->name);
35761da177e4SLinus Torvalds 			hci_acldata_packet(hdev, skb);
35771da177e4SLinus Torvalds 			break;
35781da177e4SLinus Torvalds 
35791da177e4SLinus Torvalds 		case HCI_SCODATA_PKT:
35801da177e4SLinus Torvalds 			BT_DBG("%s SCO data packet", hdev->name);
35811da177e4SLinus Torvalds 			hci_scodata_packet(hdev, skb);
35821da177e4SLinus Torvalds 			break;
35831da177e4SLinus Torvalds 
35841da177e4SLinus Torvalds 		default:
35851da177e4SLinus Torvalds 			kfree_skb(skb);
35861da177e4SLinus Torvalds 			break;
35871da177e4SLinus Torvalds 		}
35881da177e4SLinus Torvalds 	}
35891da177e4SLinus Torvalds }
35901da177e4SLinus Torvalds 
3591c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work)
35921da177e4SLinus Torvalds {
3593c347b765SGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work);
35941da177e4SLinus Torvalds 	struct sk_buff *skb;
35951da177e4SLinus Torvalds 
35962104786bSAndrei Emeltchenko 	BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name,
35972104786bSAndrei Emeltchenko 	       atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q));
35981da177e4SLinus Torvalds 
35991da177e4SLinus Torvalds 	/* Send queued commands */
36005a08ecceSAndrei Emeltchenko 	if (atomic_read(&hdev->cmd_cnt)) {
36015a08ecceSAndrei Emeltchenko 		skb = skb_dequeue(&hdev->cmd_q);
36025a08ecceSAndrei Emeltchenko 		if (!skb)
36035a08ecceSAndrei Emeltchenko 			return;
36045a08ecceSAndrei Emeltchenko 
36051da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
36061da177e4SLinus Torvalds 
3607a675d7f1SMarcel Holtmann 		hdev->sent_cmd = skb_clone(skb, GFP_KERNEL);
360870f23020SAndrei Emeltchenko 		if (hdev->sent_cmd) {
36091da177e4SLinus Torvalds 			atomic_dec(&hdev->cmd_cnt);
36101da177e4SLinus Torvalds 			hci_send_frame(skb);
36117bdb8a5cSSzymon Janc 			if (test_bit(HCI_RESET, &hdev->flags))
36127bdb8a5cSSzymon Janc 				del_timer(&hdev->cmd_timer);
36137bdb8a5cSSzymon Janc 			else
36146bd32326SVille Tervo 				mod_timer(&hdev->cmd_timer,
36155f246e89SAndrei Emeltchenko 					  jiffies + HCI_CMD_TIMEOUT);
36161da177e4SLinus Torvalds 		} else {
36171da177e4SLinus Torvalds 			skb_queue_head(&hdev->cmd_q, skb);
3618c347b765SGustavo F. Padovan 			queue_work(hdev->workqueue, &hdev->cmd_work);
36191da177e4SLinus Torvalds 		}
36201da177e4SLinus Torvalds 	}
36211da177e4SLinus Torvalds }
36222519a1fcSAndre Guedes 
362331f7956cSAndre Guedes u8 bdaddr_to_le(u8 bdaddr_type)
362431f7956cSAndre Guedes {
362531f7956cSAndre Guedes 	switch (bdaddr_type) {
362631f7956cSAndre Guedes 	case BDADDR_LE_PUBLIC:
362731f7956cSAndre Guedes 		return ADDR_LE_DEV_PUBLIC;
362831f7956cSAndre Guedes 
362931f7956cSAndre Guedes 	default:
363031f7956cSAndre Guedes 		/* Fallback to LE Random address type */
363131f7956cSAndre Guedes 		return ADDR_LE_DEV_RANDOM;
363231f7956cSAndre Guedes 	}
363331f7956cSAndre Guedes }
3634