• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  The NFC Controller Interface is the communication protocol between an
4  *  NFC Controller (NFCC) and a Device Host (DH).
5  *
6  *  Copyright (C) 2011 Texas Instruments, Inc.
7  *  Copyright (C) 2014 Marvell International Ltd.
8  *
9  *  Written by Ilan Elias <ilane@ti.com>
10  *
11  *  Acknowledgements:
12  *  This file is based on hci_core.c, which was written
13  *  by Maxim Krasnyansky.
14  */
15 
16 #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
17 
18 #include <linux/module.h>
19 #include <linux/kernel.h>
20 #include <linux/types.h>
21 #include <linux/workqueue.h>
22 #include <linux/completion.h>
23 #include <linux/export.h>
24 #include <linux/sched.h>
25 #include <linux/bitops.h>
26 #include <linux/skbuff.h>
27 
28 #include "../nfc.h"
29 #include <net/nfc/nci.h>
30 #include <net/nfc/nci_core.h>
31 #include <linux/nfc.h>
32 
33 struct core_conn_create_data {
34 	int length;
35 	struct nci_core_conn_create_cmd *cmd;
36 };
37 
38 static void nci_cmd_work(struct work_struct *work);
39 static void nci_rx_work(struct work_struct *work);
40 static void nci_tx_work(struct work_struct *work);
41 
nci_get_conn_info_by_conn_id(struct nci_dev * ndev,int conn_id)42 struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
43 						   int conn_id)
44 {
45 	struct nci_conn_info *conn_info;
46 
47 	list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
48 		if (conn_info->conn_id == conn_id)
49 			return conn_info;
50 	}
51 
52 	return NULL;
53 }
54 
nci_get_conn_info_by_dest_type_params(struct nci_dev * ndev,u8 dest_type,const struct dest_spec_params * params)55 int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
56 					  const struct dest_spec_params *params)
57 {
58 	const struct nci_conn_info *conn_info;
59 
60 	list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
61 		if (conn_info->dest_type == dest_type) {
62 			if (!params)
63 				return conn_info->conn_id;
64 
65 			if (params->id == conn_info->dest_params->id &&
66 			    params->protocol == conn_info->dest_params->protocol)
67 				return conn_info->conn_id;
68 		}
69 	}
70 
71 	return -EINVAL;
72 }
73 EXPORT_SYMBOL(nci_get_conn_info_by_dest_type_params);
74 
75 /* ---- NCI requests ---- */
76 
nci_req_complete(struct nci_dev * ndev,int result)77 void nci_req_complete(struct nci_dev *ndev, int result)
78 {
79 	if (ndev->req_status == NCI_REQ_PEND) {
80 		ndev->req_result = result;
81 		ndev->req_status = NCI_REQ_DONE;
82 		complete(&ndev->req_completion);
83 	}
84 }
85 EXPORT_SYMBOL(nci_req_complete);
86 
nci_req_cancel(struct nci_dev * ndev,int err)87 static void nci_req_cancel(struct nci_dev *ndev, int err)
88 {
89 	if (ndev->req_status == NCI_REQ_PEND) {
90 		ndev->req_result = err;
91 		ndev->req_status = NCI_REQ_CANCELED;
92 		complete(&ndev->req_completion);
93 	}
94 }
95 
96 /* Execute request and wait for completion. */
__nci_request(struct nci_dev * ndev,void (* req)(struct nci_dev * ndev,const void * opt),const void * opt,__u32 timeout)97 static int __nci_request(struct nci_dev *ndev,
98 			 void (*req)(struct nci_dev *ndev, const void *opt),
99 			 const void *opt, __u32 timeout)
100 {
101 	int rc = 0;
102 	long completion_rc;
103 
104 	ndev->req_status = NCI_REQ_PEND;
105 
106 	reinit_completion(&ndev->req_completion);
107 	req(ndev, opt);
108 	completion_rc =
109 		wait_for_completion_interruptible_timeout(&ndev->req_completion,
110 							  timeout);
111 
112 	pr_debug("wait_for_completion return %ld\n", completion_rc);
113 
114 	if (completion_rc > 0) {
115 		switch (ndev->req_status) {
116 		case NCI_REQ_DONE:
117 			rc = nci_to_errno(ndev->req_result);
118 			break;
119 
120 		case NCI_REQ_CANCELED:
121 			rc = -ndev->req_result;
122 			break;
123 
124 		default:
125 			rc = -ETIMEDOUT;
126 			break;
127 		}
128 	} else {
129 		pr_err("wait_for_completion_interruptible_timeout failed %ld\n",
130 		       completion_rc);
131 
132 		rc = ((completion_rc == 0) ? (-ETIMEDOUT) : (completion_rc));
133 	}
134 
135 	ndev->req_status = ndev->req_result = 0;
136 
137 	return rc;
138 }
139 
nci_request(struct nci_dev * ndev,void (* req)(struct nci_dev * ndev,const void * opt),const void * opt,__u32 timeout)140 inline int nci_request(struct nci_dev *ndev,
141 		       void (*req)(struct nci_dev *ndev,
142 				   const void *opt),
143 		       const void *opt, __u32 timeout)
144 {
145 	int rc;
146 
147 	/* Serialize all requests */
148 	mutex_lock(&ndev->req_lock);
149 	/* check the state after obtaing the lock against any races
150 	 * from nci_close_device when the device gets removed.
151 	 */
152 	if (test_bit(NCI_UP, &ndev->flags))
153 		rc = __nci_request(ndev, req, opt, timeout);
154 	else
155 		rc = -ENETDOWN;
156 	mutex_unlock(&ndev->req_lock);
157 
158 	return rc;
159 }
160 
nci_reset_req(struct nci_dev * ndev,const void * opt)161 static void nci_reset_req(struct nci_dev *ndev, const void *opt)
162 {
163 	struct nci_core_reset_cmd cmd;
164 
165 	cmd.reset_type = NCI_RESET_TYPE_RESET_CONFIG;
166 	nci_send_cmd(ndev, NCI_OP_CORE_RESET_CMD, 1, &cmd);
167 }
168 
nci_init_req(struct nci_dev * ndev,const void * opt)169 static void nci_init_req(struct nci_dev *ndev, const void *opt)
170 {
171 	u8 plen = 0;
172 
173 	if (opt)
174 		plen = sizeof(struct nci_core_init_v2_cmd);
175 
176 	nci_send_cmd(ndev, NCI_OP_CORE_INIT_CMD, plen, opt);
177 }
178 
nci_init_complete_req(struct nci_dev * ndev,const void * opt)179 static void nci_init_complete_req(struct nci_dev *ndev, const void *opt)
180 {
181 	struct nci_rf_disc_map_cmd cmd;
182 	struct disc_map_config *cfg = cmd.mapping_configs;
183 	__u8 *num = &cmd.num_mapping_configs;
184 	int i;
185 
186 	/* set rf mapping configurations */
187 	*num = 0;
188 
189 	/* by default mapping is set to NCI_RF_INTERFACE_FRAME */
190 	for (i = 0; i < ndev->num_supported_rf_interfaces; i++) {
191 		if (ndev->supported_rf_interfaces[i] ==
192 		    NCI_RF_INTERFACE_ISO_DEP) {
193 			cfg[*num].rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
194 			cfg[*num].mode = NCI_DISC_MAP_MODE_POLL |
195 				NCI_DISC_MAP_MODE_LISTEN;
196 			cfg[*num].rf_interface = NCI_RF_INTERFACE_ISO_DEP;
197 			(*num)++;
198 		} else if (ndev->supported_rf_interfaces[i] ==
199 			   NCI_RF_INTERFACE_NFC_DEP) {
200 			cfg[*num].rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
201 			cfg[*num].mode = NCI_DISC_MAP_MODE_POLL |
202 				NCI_DISC_MAP_MODE_LISTEN;
203 			cfg[*num].rf_interface = NCI_RF_INTERFACE_NFC_DEP;
204 			(*num)++;
205 		}
206 
207 		if (*num == NCI_MAX_NUM_MAPPING_CONFIGS)
208 			break;
209 	}
210 
211 	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_MAP_CMD,
212 		     (1 + ((*num) * sizeof(struct disc_map_config))), &cmd);
213 }
214 
215 struct nci_set_config_param {
216 	__u8		id;
217 	size_t		len;
218 	const __u8	*val;
219 };
220 
nci_set_config_req(struct nci_dev * ndev,const void * opt)221 static void nci_set_config_req(struct nci_dev *ndev, const void *opt)
222 {
223 	const struct nci_set_config_param *param = opt;
224 	struct nci_core_set_config_cmd cmd;
225 
226 	BUG_ON(param->len > NCI_MAX_PARAM_LEN);
227 
228 	cmd.num_params = 1;
229 	cmd.param.id = param->id;
230 	cmd.param.len = param->len;
231 	memcpy(cmd.param.val, param->val, param->len);
232 
233 	nci_send_cmd(ndev, NCI_OP_CORE_SET_CONFIG_CMD, (3 + param->len), &cmd);
234 }
235 
236 struct nci_rf_discover_param {
237 	__u32	im_protocols;
238 	__u32	tm_protocols;
239 };
240 
nci_rf_discover_req(struct nci_dev * ndev,const void * opt)241 static void nci_rf_discover_req(struct nci_dev *ndev, const void *opt)
242 {
243 	const struct nci_rf_discover_param *param = opt;
244 	struct nci_rf_disc_cmd cmd;
245 
246 	cmd.num_disc_configs = 0;
247 
248 	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
249 	    (param->im_protocols & NFC_PROTO_JEWEL_MASK ||
250 	     param->im_protocols & NFC_PROTO_MIFARE_MASK ||
251 	     param->im_protocols & NFC_PROTO_ISO14443_MASK ||
252 	     param->im_protocols & NFC_PROTO_NFC_DEP_MASK)) {
253 		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
254 			NCI_NFC_A_PASSIVE_POLL_MODE;
255 		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
256 		cmd.num_disc_configs++;
257 	}
258 
259 	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
260 	    (param->im_protocols & NFC_PROTO_ISO14443_B_MASK)) {
261 		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
262 			NCI_NFC_B_PASSIVE_POLL_MODE;
263 		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
264 		cmd.num_disc_configs++;
265 	}
266 
267 	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
268 	    (param->im_protocols & NFC_PROTO_FELICA_MASK ||
269 	     param->im_protocols & NFC_PROTO_NFC_DEP_MASK)) {
270 		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
271 			NCI_NFC_F_PASSIVE_POLL_MODE;
272 		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
273 		cmd.num_disc_configs++;
274 	}
275 
276 	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
277 	    (param->im_protocols & NFC_PROTO_ISO15693_MASK)) {
278 		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
279 			NCI_NFC_V_PASSIVE_POLL_MODE;
280 		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
281 		cmd.num_disc_configs++;
282 	}
283 
284 	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS - 1) &&
285 	    (param->tm_protocols & NFC_PROTO_NFC_DEP_MASK)) {
286 		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
287 			NCI_NFC_A_PASSIVE_LISTEN_MODE;
288 		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
289 		cmd.num_disc_configs++;
290 		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
291 			NCI_NFC_F_PASSIVE_LISTEN_MODE;
292 		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
293 		cmd.num_disc_configs++;
294 	}
295 
296 	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD,
297 		     (1 + (cmd.num_disc_configs * sizeof(struct disc_config))),
298 		     &cmd);
299 }
300 
301 struct nci_rf_discover_select_param {
302 	__u8	rf_discovery_id;
303 	__u8	rf_protocol;
304 };
305 
nci_rf_discover_select_req(struct nci_dev * ndev,const void * opt)306 static void nci_rf_discover_select_req(struct nci_dev *ndev, const void *opt)
307 {
308 	const struct nci_rf_discover_select_param *param = opt;
309 	struct nci_rf_discover_select_cmd cmd;
310 
311 	cmd.rf_discovery_id = param->rf_discovery_id;
312 	cmd.rf_protocol = param->rf_protocol;
313 
314 	switch (cmd.rf_protocol) {
315 	case NCI_RF_PROTOCOL_ISO_DEP:
316 		cmd.rf_interface = NCI_RF_INTERFACE_ISO_DEP;
317 		break;
318 
319 	case NCI_RF_PROTOCOL_NFC_DEP:
320 		cmd.rf_interface = NCI_RF_INTERFACE_NFC_DEP;
321 		break;
322 
323 	default:
324 		cmd.rf_interface = NCI_RF_INTERFACE_FRAME;
325 		break;
326 	}
327 
328 	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_SELECT_CMD,
329 		     sizeof(struct nci_rf_discover_select_cmd), &cmd);
330 }
331 
nci_rf_deactivate_req(struct nci_dev * ndev,const void * opt)332 static void nci_rf_deactivate_req(struct nci_dev *ndev, const void *opt)
333 {
334 	struct nci_rf_deactivate_cmd cmd;
335 
336 	cmd.type = (unsigned long)opt;
337 
338 	nci_send_cmd(ndev, NCI_OP_RF_DEACTIVATE_CMD,
339 		     sizeof(struct nci_rf_deactivate_cmd), &cmd);
340 }
341 
342 struct nci_cmd_param {
343 	__u16 opcode;
344 	size_t len;
345 	const __u8 *payload;
346 };
347 
nci_generic_req(struct nci_dev * ndev,const void * opt)348 static void nci_generic_req(struct nci_dev *ndev, const void *opt)
349 {
350 	const struct nci_cmd_param *param = opt;
351 
352 	nci_send_cmd(ndev, param->opcode, param->len, param->payload);
353 }
354 
nci_prop_cmd(struct nci_dev * ndev,__u8 oid,size_t len,const __u8 * payload)355 int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, const __u8 *payload)
356 {
357 	struct nci_cmd_param param;
358 
359 	param.opcode = nci_opcode_pack(NCI_GID_PROPRIETARY, oid);
360 	param.len = len;
361 	param.payload = payload;
362 
363 	return __nci_request(ndev, nci_generic_req, &param,
364 			     msecs_to_jiffies(NCI_CMD_TIMEOUT));
365 }
366 EXPORT_SYMBOL(nci_prop_cmd);
367 
nci_core_cmd(struct nci_dev * ndev,__u16 opcode,size_t len,const __u8 * payload)368 int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len,
369 		 const __u8 *payload)
370 {
371 	struct nci_cmd_param param;
372 
373 	param.opcode = opcode;
374 	param.len = len;
375 	param.payload = payload;
376 
377 	return __nci_request(ndev, nci_generic_req, &param,
378 			     msecs_to_jiffies(NCI_CMD_TIMEOUT));
379 }
380 EXPORT_SYMBOL(nci_core_cmd);
381 
nci_core_reset(struct nci_dev * ndev)382 int nci_core_reset(struct nci_dev *ndev)
383 {
384 	return __nci_request(ndev, nci_reset_req, (void *)0,
385 			     msecs_to_jiffies(NCI_RESET_TIMEOUT));
386 }
387 EXPORT_SYMBOL(nci_core_reset);
388 
nci_core_init(struct nci_dev * ndev)389 int nci_core_init(struct nci_dev *ndev)
390 {
391 	return __nci_request(ndev, nci_init_req, (void *)0,
392 			     msecs_to_jiffies(NCI_INIT_TIMEOUT));
393 }
394 EXPORT_SYMBOL(nci_core_init);
395 
396 struct nci_loopback_data {
397 	u8 conn_id;
398 	struct sk_buff *data;
399 };
400 
nci_send_data_req(struct nci_dev * ndev,const void * opt)401 static void nci_send_data_req(struct nci_dev *ndev, const void *opt)
402 {
403 	const struct nci_loopback_data *data = opt;
404 
405 	nci_send_data(ndev, data->conn_id, data->data);
406 }
407 
nci_nfcc_loopback_cb(void * context,struct sk_buff * skb,int err)408 static void nci_nfcc_loopback_cb(void *context, struct sk_buff *skb, int err)
409 {
410 	struct nci_dev *ndev = (struct nci_dev *)context;
411 	struct nci_conn_info *conn_info;
412 
413 	conn_info = nci_get_conn_info_by_conn_id(ndev, ndev->cur_conn_id);
414 	if (!conn_info) {
415 		nci_req_complete(ndev, NCI_STATUS_REJECTED);
416 		return;
417 	}
418 
419 	conn_info->rx_skb = skb;
420 
421 	nci_req_complete(ndev, NCI_STATUS_OK);
422 }
423 
nci_nfcc_loopback(struct nci_dev * ndev,const void * data,size_t data_len,struct sk_buff ** resp)424 int nci_nfcc_loopback(struct nci_dev *ndev, const void *data, size_t data_len,
425 		      struct sk_buff **resp)
426 {
427 	int r;
428 	struct nci_loopback_data loopback_data;
429 	struct nci_conn_info *conn_info;
430 	struct sk_buff *skb;
431 	int conn_id = nci_get_conn_info_by_dest_type_params(ndev,
432 					NCI_DESTINATION_NFCC_LOOPBACK, NULL);
433 
434 	if (conn_id < 0) {
435 		r = nci_core_conn_create(ndev, NCI_DESTINATION_NFCC_LOOPBACK,
436 					 0, 0, NULL);
437 		if (r != NCI_STATUS_OK)
438 			return r;
439 
440 		conn_id = nci_get_conn_info_by_dest_type_params(ndev,
441 					NCI_DESTINATION_NFCC_LOOPBACK,
442 					NULL);
443 	}
444 
445 	conn_info = nci_get_conn_info_by_conn_id(ndev, conn_id);
446 	if (!conn_info)
447 		return -EPROTO;
448 
449 	/* store cb and context to be used on receiving data */
450 	conn_info->data_exchange_cb = nci_nfcc_loopback_cb;
451 	conn_info->data_exchange_cb_context = ndev;
452 
453 	skb = nci_skb_alloc(ndev, NCI_DATA_HDR_SIZE + data_len, GFP_KERNEL);
454 	if (!skb)
455 		return -ENOMEM;
456 
457 	skb_reserve(skb, NCI_DATA_HDR_SIZE);
458 	skb_put_data(skb, data, data_len);
459 
460 	loopback_data.conn_id = conn_id;
461 	loopback_data.data = skb;
462 
463 	ndev->cur_conn_id = conn_id;
464 	r = nci_request(ndev, nci_send_data_req, &loopback_data,
465 			msecs_to_jiffies(NCI_DATA_TIMEOUT));
466 	if (r == NCI_STATUS_OK && resp)
467 		*resp = conn_info->rx_skb;
468 
469 	return r;
470 }
471 EXPORT_SYMBOL(nci_nfcc_loopback);
472 
nci_open_device(struct nci_dev * ndev)473 static int nci_open_device(struct nci_dev *ndev)
474 {
475 	int rc = 0;
476 
477 	mutex_lock(&ndev->req_lock);
478 
479 	if (test_bit(NCI_UNREG, &ndev->flags)) {
480 		rc = -ENODEV;
481 		goto done;
482 	}
483 
484 	if (test_bit(NCI_UP, &ndev->flags)) {
485 		rc = -EALREADY;
486 		goto done;
487 	}
488 
489 	if (ndev->ops->open(ndev)) {
490 		rc = -EIO;
491 		goto done;
492 	}
493 
494 	atomic_set(&ndev->cmd_cnt, 1);
495 
496 	set_bit(NCI_INIT, &ndev->flags);
497 
498 	if (ndev->ops->init)
499 		rc = ndev->ops->init(ndev);
500 
501 	if (!rc) {
502 		rc = __nci_request(ndev, nci_reset_req, (void *)0,
503 				   msecs_to_jiffies(NCI_RESET_TIMEOUT));
504 	}
505 
506 	if (!rc && ndev->ops->setup) {
507 		rc = ndev->ops->setup(ndev);
508 	}
509 
510 	if (!rc) {
511 		struct nci_core_init_v2_cmd nci_init_v2_cmd = {
512 			.feature1 = NCI_FEATURE_DISABLE,
513 			.feature2 = NCI_FEATURE_DISABLE
514 		};
515 		const void *opt = NULL;
516 
517 		if (ndev->nci_ver & NCI_VER_2_MASK)
518 			opt = &nci_init_v2_cmd;
519 
520 		rc = __nci_request(ndev, nci_init_req, opt,
521 				   msecs_to_jiffies(NCI_INIT_TIMEOUT));
522 	}
523 
524 	if (!rc && ndev->ops->post_setup)
525 		rc = ndev->ops->post_setup(ndev);
526 
527 	if (!rc) {
528 		rc = __nci_request(ndev, nci_init_complete_req, (void *)0,
529 				   msecs_to_jiffies(NCI_INIT_TIMEOUT));
530 	}
531 
532 	clear_bit(NCI_INIT, &ndev->flags);
533 
534 	if (!rc) {
535 		set_bit(NCI_UP, &ndev->flags);
536 		nci_clear_target_list(ndev);
537 		atomic_set(&ndev->state, NCI_IDLE);
538 	} else {
539 		/* Init failed, cleanup */
540 		skb_queue_purge(&ndev->cmd_q);
541 		skb_queue_purge(&ndev->rx_q);
542 		skb_queue_purge(&ndev->tx_q);
543 
544 		ndev->ops->close(ndev);
545 		ndev->flags &= BIT(NCI_UNREG);
546 	}
547 
548 done:
549 	mutex_unlock(&ndev->req_lock);
550 	return rc;
551 }
552 
nci_close_device(struct nci_dev * ndev)553 static int nci_close_device(struct nci_dev *ndev)
554 {
555 	nci_req_cancel(ndev, ENODEV);
556 
557 	/* This mutex needs to be held as a barrier for
558 	 * caller nci_unregister_device
559 	 */
560 	mutex_lock(&ndev->req_lock);
561 
562 	if (!test_and_clear_bit(NCI_UP, &ndev->flags)) {
563 		/* Need to flush the cmd wq in case
564 		 * there is a queued/running cmd_work
565 		 */
566 		flush_workqueue(ndev->cmd_wq);
567 		del_timer_sync(&ndev->cmd_timer);
568 		del_timer_sync(&ndev->data_timer);
569 		mutex_unlock(&ndev->req_lock);
570 		return 0;
571 	}
572 
573 	/* Drop RX and TX queues */
574 	skb_queue_purge(&ndev->rx_q);
575 	skb_queue_purge(&ndev->tx_q);
576 
577 	/* Flush RX and TX wq */
578 	flush_workqueue(ndev->rx_wq);
579 	flush_workqueue(ndev->tx_wq);
580 
581 	/* Reset device */
582 	skb_queue_purge(&ndev->cmd_q);
583 	atomic_set(&ndev->cmd_cnt, 1);
584 
585 	set_bit(NCI_INIT, &ndev->flags);
586 	__nci_request(ndev, nci_reset_req, (void *)0,
587 		      msecs_to_jiffies(NCI_RESET_TIMEOUT));
588 
589 	/* After this point our queues are empty
590 	 * and no works are scheduled.
591 	 */
592 	ndev->ops->close(ndev);
593 
594 	clear_bit(NCI_INIT, &ndev->flags);
595 
596 	/* Flush cmd wq */
597 	flush_workqueue(ndev->cmd_wq);
598 
599 	del_timer_sync(&ndev->cmd_timer);
600 
601 	/* Clear flags except NCI_UNREG */
602 	ndev->flags &= BIT(NCI_UNREG);
603 
604 	mutex_unlock(&ndev->req_lock);
605 
606 	return 0;
607 }
608 
609 /* NCI command timer function */
nci_cmd_timer(struct timer_list * t)610 static void nci_cmd_timer(struct timer_list *t)
611 {
612 	struct nci_dev *ndev = from_timer(ndev, t, cmd_timer);
613 
614 	atomic_set(&ndev->cmd_cnt, 1);
615 	queue_work(ndev->cmd_wq, &ndev->cmd_work);
616 }
617 
618 /* NCI data exchange timer function */
nci_data_timer(struct timer_list * t)619 static void nci_data_timer(struct timer_list *t)
620 {
621 	struct nci_dev *ndev = from_timer(ndev, t, data_timer);
622 
623 	set_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
624 	queue_work(ndev->rx_wq, &ndev->rx_work);
625 }
626 
nci_dev_up(struct nfc_dev * nfc_dev)627 static int nci_dev_up(struct nfc_dev *nfc_dev)
628 {
629 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
630 
631 	return nci_open_device(ndev);
632 }
633 
nci_dev_down(struct nfc_dev * nfc_dev)634 static int nci_dev_down(struct nfc_dev *nfc_dev)
635 {
636 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
637 
638 	return nci_close_device(ndev);
639 }
640 
nci_set_config(struct nci_dev * ndev,__u8 id,size_t len,const __u8 * val)641 int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, const __u8 *val)
642 {
643 	struct nci_set_config_param param;
644 
645 	if (!val || !len)
646 		return 0;
647 
648 	param.id = id;
649 	param.len = len;
650 	param.val = val;
651 
652 	return __nci_request(ndev, nci_set_config_req, &param,
653 			     msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
654 }
655 EXPORT_SYMBOL(nci_set_config);
656 
nci_nfcee_discover_req(struct nci_dev * ndev,const void * opt)657 static void nci_nfcee_discover_req(struct nci_dev *ndev, const void *opt)
658 {
659 	struct nci_nfcee_discover_cmd cmd;
660 	__u8 action = (unsigned long)opt;
661 
662 	cmd.discovery_action = action;
663 
664 	nci_send_cmd(ndev, NCI_OP_NFCEE_DISCOVER_CMD, 1, &cmd);
665 }
666 
nci_nfcee_discover(struct nci_dev * ndev,u8 action)667 int nci_nfcee_discover(struct nci_dev *ndev, u8 action)
668 {
669 	unsigned long opt = action;
670 
671 	return __nci_request(ndev, nci_nfcee_discover_req, (void *)opt,
672 				msecs_to_jiffies(NCI_CMD_TIMEOUT));
673 }
674 EXPORT_SYMBOL(nci_nfcee_discover);
675 
nci_nfcee_mode_set_req(struct nci_dev * ndev,const void * opt)676 static void nci_nfcee_mode_set_req(struct nci_dev *ndev, const void *opt)
677 {
678 	const struct nci_nfcee_mode_set_cmd *cmd = opt;
679 
680 	nci_send_cmd(ndev, NCI_OP_NFCEE_MODE_SET_CMD,
681 		     sizeof(struct nci_nfcee_mode_set_cmd), cmd);
682 }
683 
nci_nfcee_mode_set(struct nci_dev * ndev,u8 nfcee_id,u8 nfcee_mode)684 int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode)
685 {
686 	struct nci_nfcee_mode_set_cmd cmd;
687 
688 	cmd.nfcee_id = nfcee_id;
689 	cmd.nfcee_mode = nfcee_mode;
690 
691 	return __nci_request(ndev, nci_nfcee_mode_set_req, &cmd,
692 			     msecs_to_jiffies(NCI_CMD_TIMEOUT));
693 }
694 EXPORT_SYMBOL(nci_nfcee_mode_set);
695 
nci_core_conn_create_req(struct nci_dev * ndev,const void * opt)696 static void nci_core_conn_create_req(struct nci_dev *ndev, const void *opt)
697 {
698 	const struct core_conn_create_data *data = opt;
699 
700 	nci_send_cmd(ndev, NCI_OP_CORE_CONN_CREATE_CMD, data->length, data->cmd);
701 }
702 
nci_core_conn_create(struct nci_dev * ndev,u8 destination_type,u8 number_destination_params,size_t params_len,const struct core_conn_create_dest_spec_params * params)703 int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type,
704 			 u8 number_destination_params,
705 			 size_t params_len,
706 			 const struct core_conn_create_dest_spec_params *params)
707 {
708 	int r;
709 	struct nci_core_conn_create_cmd *cmd;
710 	struct core_conn_create_data data;
711 
712 	data.length = params_len + sizeof(struct nci_core_conn_create_cmd);
713 	cmd = kzalloc(data.length, GFP_KERNEL);
714 	if (!cmd)
715 		return -ENOMEM;
716 
717 	cmd->destination_type = destination_type;
718 	cmd->number_destination_params = number_destination_params;
719 
720 	data.cmd = cmd;
721 
722 	if (params) {
723 		memcpy(cmd->params, params, params_len);
724 		if (params->length > 0)
725 			memcpy(&ndev->cur_params,
726 			       &params->value[DEST_SPEC_PARAMS_ID_INDEX],
727 			       sizeof(struct dest_spec_params));
728 		else
729 			ndev->cur_params.id = 0;
730 	} else {
731 		ndev->cur_params.id = 0;
732 	}
733 	ndev->cur_dest_type = destination_type;
734 
735 	r = __nci_request(ndev, nci_core_conn_create_req, &data,
736 			  msecs_to_jiffies(NCI_CMD_TIMEOUT));
737 	kfree(cmd);
738 	return r;
739 }
740 EXPORT_SYMBOL(nci_core_conn_create);
741 
nci_core_conn_close_req(struct nci_dev * ndev,const void * opt)742 static void nci_core_conn_close_req(struct nci_dev *ndev, const void *opt)
743 {
744 	__u8 conn_id = (unsigned long)opt;
745 
746 	nci_send_cmd(ndev, NCI_OP_CORE_CONN_CLOSE_CMD, 1, &conn_id);
747 }
748 
nci_core_conn_close(struct nci_dev * ndev,u8 conn_id)749 int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id)
750 {
751 	unsigned long opt = conn_id;
752 
753 	ndev->cur_conn_id = conn_id;
754 	return __nci_request(ndev, nci_core_conn_close_req, (void *)opt,
755 			     msecs_to_jiffies(NCI_CMD_TIMEOUT));
756 }
757 EXPORT_SYMBOL(nci_core_conn_close);
758 
nci_set_local_general_bytes(struct nfc_dev * nfc_dev)759 static int nci_set_local_general_bytes(struct nfc_dev *nfc_dev)
760 {
761 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
762 	struct nci_set_config_param param;
763 	int rc;
764 
765 	param.val = nfc_get_local_general_bytes(nfc_dev, &param.len);
766 	if ((param.val == NULL) || (param.len == 0))
767 		return 0;
768 
769 	if (param.len > NFC_MAX_GT_LEN)
770 		return -EINVAL;
771 
772 	param.id = NCI_PN_ATR_REQ_GEN_BYTES;
773 
774 	rc = nci_request(ndev, nci_set_config_req, &param,
775 			 msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
776 	if (rc)
777 		return rc;
778 
779 	param.id = NCI_LN_ATR_RES_GEN_BYTES;
780 
781 	return nci_request(ndev, nci_set_config_req, &param,
782 			   msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
783 }
784 
nci_set_listen_parameters(struct nfc_dev * nfc_dev)785 static int nci_set_listen_parameters(struct nfc_dev *nfc_dev)
786 {
787 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
788 	int rc;
789 	__u8 val;
790 
791 	val = NCI_LA_SEL_INFO_NFC_DEP_MASK;
792 
793 	rc = nci_set_config(ndev, NCI_LA_SEL_INFO, 1, &val);
794 	if (rc)
795 		return rc;
796 
797 	val = NCI_LF_PROTOCOL_TYPE_NFC_DEP_MASK;
798 
799 	rc = nci_set_config(ndev, NCI_LF_PROTOCOL_TYPE, 1, &val);
800 	if (rc)
801 		return rc;
802 
803 	val = NCI_LF_CON_BITR_F_212 | NCI_LF_CON_BITR_F_424;
804 
805 	return nci_set_config(ndev, NCI_LF_CON_BITR_F, 1, &val);
806 }
807 
nci_start_poll(struct nfc_dev * nfc_dev,__u32 im_protocols,__u32 tm_protocols)808 static int nci_start_poll(struct nfc_dev *nfc_dev,
809 			  __u32 im_protocols, __u32 tm_protocols)
810 {
811 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
812 	struct nci_rf_discover_param param;
813 	int rc;
814 
815 	if ((atomic_read(&ndev->state) == NCI_DISCOVERY) ||
816 	    (atomic_read(&ndev->state) == NCI_W4_ALL_DISCOVERIES)) {
817 		pr_err("unable to start poll, since poll is already active\n");
818 		return -EBUSY;
819 	}
820 
821 	if (ndev->target_active_prot) {
822 		pr_err("there is an active target\n");
823 		return -EBUSY;
824 	}
825 
826 	if ((atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) ||
827 	    (atomic_read(&ndev->state) == NCI_POLL_ACTIVE)) {
828 		pr_debug("target active or w4 select, implicitly deactivate\n");
829 
830 		rc = nci_request(ndev, nci_rf_deactivate_req,
831 				 (void *)NCI_DEACTIVATE_TYPE_IDLE_MODE,
832 				 msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
833 		if (rc)
834 			return -EBUSY;
835 	}
836 
837 	if ((im_protocols | tm_protocols) & NFC_PROTO_NFC_DEP_MASK) {
838 		rc = nci_set_local_general_bytes(nfc_dev);
839 		if (rc) {
840 			pr_err("failed to set local general bytes\n");
841 			return rc;
842 		}
843 	}
844 
845 	if (tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
846 		rc = nci_set_listen_parameters(nfc_dev);
847 		if (rc)
848 			pr_err("failed to set listen parameters\n");
849 	}
850 
851 	param.im_protocols = im_protocols;
852 	param.tm_protocols = tm_protocols;
853 	rc = nci_request(ndev, nci_rf_discover_req, &param,
854 			 msecs_to_jiffies(NCI_RF_DISC_TIMEOUT));
855 
856 	if (!rc)
857 		ndev->poll_prots = im_protocols;
858 
859 	return rc;
860 }
861 
nci_stop_poll(struct nfc_dev * nfc_dev)862 static void nci_stop_poll(struct nfc_dev *nfc_dev)
863 {
864 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
865 
866 	if ((atomic_read(&ndev->state) != NCI_DISCOVERY) &&
867 	    (atomic_read(&ndev->state) != NCI_W4_ALL_DISCOVERIES)) {
868 		pr_err("unable to stop poll, since poll is not active\n");
869 		return;
870 	}
871 
872 	nci_request(ndev, nci_rf_deactivate_req,
873 		    (void *)NCI_DEACTIVATE_TYPE_IDLE_MODE,
874 		    msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
875 }
876 
nci_activate_target(struct nfc_dev * nfc_dev,struct nfc_target * target,__u32 protocol)877 static int nci_activate_target(struct nfc_dev *nfc_dev,
878 			       struct nfc_target *target, __u32 protocol)
879 {
880 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
881 	struct nci_rf_discover_select_param param;
882 	const struct nfc_target *nci_target = NULL;
883 	int i;
884 	int rc = 0;
885 
886 	pr_debug("target_idx %d, protocol 0x%x\n", target->idx, protocol);
887 
888 	if ((atomic_read(&ndev->state) != NCI_W4_HOST_SELECT) &&
889 	    (atomic_read(&ndev->state) != NCI_POLL_ACTIVE)) {
890 		pr_err("there is no available target to activate\n");
891 		return -EINVAL;
892 	}
893 
894 	if (ndev->target_active_prot) {
895 		pr_err("there is already an active target\n");
896 		return -EBUSY;
897 	}
898 
899 	for (i = 0; i < ndev->n_targets; i++) {
900 		if (ndev->targets[i].idx == target->idx) {
901 			nci_target = &ndev->targets[i];
902 			break;
903 		}
904 	}
905 
906 	if (!nci_target) {
907 		pr_err("unable to find the selected target\n");
908 		return -EINVAL;
909 	}
910 
911 	if (protocol >= NFC_PROTO_MAX) {
912 		pr_err("the requested nfc protocol is invalid\n");
913 		return -EINVAL;
914 	}
915 
916 	if (!(nci_target->supported_protocols & (1 << protocol))) {
917 		pr_err("target does not support the requested protocol 0x%x\n",
918 		       protocol);
919 		return -EINVAL;
920 	}
921 
922 	if (atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) {
923 		param.rf_discovery_id = nci_target->logical_idx;
924 
925 		if (protocol == NFC_PROTO_JEWEL)
926 			param.rf_protocol = NCI_RF_PROTOCOL_T1T;
927 		else if (protocol == NFC_PROTO_MIFARE)
928 			param.rf_protocol = NCI_RF_PROTOCOL_T2T;
929 		else if (protocol == NFC_PROTO_FELICA)
930 			param.rf_protocol = NCI_RF_PROTOCOL_T3T;
931 		else if (protocol == NFC_PROTO_ISO14443 ||
932 			 protocol == NFC_PROTO_ISO14443_B)
933 			param.rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
934 		else
935 			param.rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
936 
937 		rc = nci_request(ndev, nci_rf_discover_select_req, &param,
938 				 msecs_to_jiffies(NCI_RF_DISC_SELECT_TIMEOUT));
939 	}
940 
941 	if (!rc)
942 		ndev->target_active_prot = protocol;
943 
944 	return rc;
945 }
946 
nci_deactivate_target(struct nfc_dev * nfc_dev,struct nfc_target * target,__u8 mode)947 static void nci_deactivate_target(struct nfc_dev *nfc_dev,
948 				  struct nfc_target *target,
949 				  __u8 mode)
950 {
951 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
952 	unsigned long nci_mode = NCI_DEACTIVATE_TYPE_IDLE_MODE;
953 
954 	pr_debug("entry\n");
955 
956 	if (!ndev->target_active_prot) {
957 		pr_err("unable to deactivate target, no active target\n");
958 		return;
959 	}
960 
961 	ndev->target_active_prot = 0;
962 
963 	switch (mode) {
964 	case NFC_TARGET_MODE_SLEEP:
965 		nci_mode = NCI_DEACTIVATE_TYPE_SLEEP_MODE;
966 		break;
967 	}
968 
969 	if (atomic_read(&ndev->state) == NCI_POLL_ACTIVE) {
970 		nci_request(ndev, nci_rf_deactivate_req, (void *)nci_mode,
971 			    msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
972 	}
973 }
974 
nci_dep_link_up(struct nfc_dev * nfc_dev,struct nfc_target * target,__u8 comm_mode,__u8 * gb,size_t gb_len)975 static int nci_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
976 			   __u8 comm_mode, __u8 *gb, size_t gb_len)
977 {
978 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
979 	int rc;
980 
981 	pr_debug("target_idx %d, comm_mode %d\n", target->idx, comm_mode);
982 
983 	rc = nci_activate_target(nfc_dev, target, NFC_PROTO_NFC_DEP);
984 	if (rc)
985 		return rc;
986 
987 	rc = nfc_set_remote_general_bytes(nfc_dev, ndev->remote_gb,
988 					  ndev->remote_gb_len);
989 	if (!rc)
990 		rc = nfc_dep_link_is_up(nfc_dev, target->idx, NFC_COMM_PASSIVE,
991 					NFC_RF_INITIATOR);
992 
993 	return rc;
994 }
995 
nci_dep_link_down(struct nfc_dev * nfc_dev)996 static int nci_dep_link_down(struct nfc_dev *nfc_dev)
997 {
998 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
999 	int rc;
1000 
1001 	pr_debug("entry\n");
1002 
1003 	if (nfc_dev->rf_mode == NFC_RF_INITIATOR) {
1004 		nci_deactivate_target(nfc_dev, NULL, NCI_DEACTIVATE_TYPE_IDLE_MODE);
1005 	} else {
1006 		if (atomic_read(&ndev->state) == NCI_LISTEN_ACTIVE ||
1007 		    atomic_read(&ndev->state) == NCI_DISCOVERY) {
1008 			nci_request(ndev, nci_rf_deactivate_req, (void *)0,
1009 				    msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
1010 		}
1011 
1012 		rc = nfc_tm_deactivated(nfc_dev);
1013 		if (rc)
1014 			pr_err("error when signaling tm deactivation\n");
1015 	}
1016 
1017 	return 0;
1018 }
1019 
1020 
nci_transceive(struct nfc_dev * nfc_dev,struct nfc_target * target,struct sk_buff * skb,data_exchange_cb_t cb,void * cb_context)1021 static int nci_transceive(struct nfc_dev *nfc_dev, struct nfc_target *target,
1022 			  struct sk_buff *skb,
1023 			  data_exchange_cb_t cb, void *cb_context)
1024 {
1025 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1026 	int rc;
1027 	struct nci_conn_info *conn_info;
1028 
1029 	conn_info = ndev->rf_conn_info;
1030 	if (!conn_info)
1031 		return -EPROTO;
1032 
1033 	pr_debug("target_idx %d, len %d\n", target->idx, skb->len);
1034 
1035 	if (!ndev->target_active_prot) {
1036 		pr_err("unable to exchange data, no active target\n");
1037 		return -EINVAL;
1038 	}
1039 
1040 	if (test_and_set_bit(NCI_DATA_EXCHANGE, &ndev->flags))
1041 		return -EBUSY;
1042 
1043 	/* store cb and context to be used on receiving data */
1044 	conn_info->data_exchange_cb = cb;
1045 	conn_info->data_exchange_cb_context = cb_context;
1046 
1047 	rc = nci_send_data(ndev, NCI_STATIC_RF_CONN_ID, skb);
1048 	if (rc)
1049 		clear_bit(NCI_DATA_EXCHANGE, &ndev->flags);
1050 
1051 	return rc;
1052 }
1053 
nci_tm_send(struct nfc_dev * nfc_dev,struct sk_buff * skb)1054 static int nci_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb)
1055 {
1056 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1057 	int rc;
1058 
1059 	rc = nci_send_data(ndev, NCI_STATIC_RF_CONN_ID, skb);
1060 	if (rc)
1061 		pr_err("unable to send data\n");
1062 
1063 	return rc;
1064 }
1065 
nci_enable_se(struct nfc_dev * nfc_dev,u32 se_idx)1066 static int nci_enable_se(struct nfc_dev *nfc_dev, u32 se_idx)
1067 {
1068 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1069 
1070 	if (ndev->ops->enable_se)
1071 		return ndev->ops->enable_se(ndev, se_idx);
1072 
1073 	return 0;
1074 }
1075 
nci_disable_se(struct nfc_dev * nfc_dev,u32 se_idx)1076 static int nci_disable_se(struct nfc_dev *nfc_dev, u32 se_idx)
1077 {
1078 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1079 
1080 	if (ndev->ops->disable_se)
1081 		return ndev->ops->disable_se(ndev, se_idx);
1082 
1083 	return 0;
1084 }
1085 
nci_discover_se(struct nfc_dev * nfc_dev)1086 static int nci_discover_se(struct nfc_dev *nfc_dev)
1087 {
1088 	int r;
1089 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1090 
1091 	if (ndev->ops->discover_se) {
1092 		r = nci_nfcee_discover(ndev, NCI_NFCEE_DISCOVERY_ACTION_ENABLE);
1093 		if (r != NCI_STATUS_OK)
1094 			return -EPROTO;
1095 
1096 		return ndev->ops->discover_se(ndev);
1097 	}
1098 
1099 	return 0;
1100 }
1101 
nci_se_io(struct nfc_dev * nfc_dev,u32 se_idx,u8 * apdu,size_t apdu_length,se_io_cb_t cb,void * cb_context)1102 static int nci_se_io(struct nfc_dev *nfc_dev, u32 se_idx,
1103 		     u8 *apdu, size_t apdu_length,
1104 		     se_io_cb_t cb, void *cb_context)
1105 {
1106 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1107 
1108 	if (ndev->ops->se_io)
1109 		return ndev->ops->se_io(ndev, se_idx, apdu,
1110 				apdu_length, cb, cb_context);
1111 
1112 	return 0;
1113 }
1114 
nci_fw_download(struct nfc_dev * nfc_dev,const char * firmware_name)1115 static int nci_fw_download(struct nfc_dev *nfc_dev, const char *firmware_name)
1116 {
1117 	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1118 
1119 	if (!ndev->ops->fw_download)
1120 		return -ENOTSUPP;
1121 
1122 	return ndev->ops->fw_download(ndev, firmware_name);
1123 }
1124 
1125 static const struct nfc_ops nci_nfc_ops = {
1126 	.dev_up = nci_dev_up,
1127 	.dev_down = nci_dev_down,
1128 	.start_poll = nci_start_poll,
1129 	.stop_poll = nci_stop_poll,
1130 	.dep_link_up = nci_dep_link_up,
1131 	.dep_link_down = nci_dep_link_down,
1132 	.activate_target = nci_activate_target,
1133 	.deactivate_target = nci_deactivate_target,
1134 	.im_transceive = nci_transceive,
1135 	.tm_send = nci_tm_send,
1136 	.enable_se = nci_enable_se,
1137 	.disable_se = nci_disable_se,
1138 	.discover_se = nci_discover_se,
1139 	.se_io = nci_se_io,
1140 	.fw_download = nci_fw_download,
1141 };
1142 
1143 /* ---- Interface to NCI drivers ---- */
1144 /**
1145  * nci_allocate_device - allocate a new nci device
1146  *
1147  * @ops: device operations
1148  * @supported_protocols: NFC protocols supported by the device
1149  * @tx_headroom: Reserved space at beginning of skb
1150  * @tx_tailroom: Reserved space at end of skb
1151  */
nci_allocate_device(const struct nci_ops * ops,__u32 supported_protocols,int tx_headroom,int tx_tailroom)1152 struct nci_dev *nci_allocate_device(const struct nci_ops *ops,
1153 				    __u32 supported_protocols,
1154 				    int tx_headroom, int tx_tailroom)
1155 {
1156 	struct nci_dev *ndev;
1157 
1158 	pr_debug("supported_protocols 0x%x\n", supported_protocols);
1159 
1160 	if (!ops->open || !ops->close || !ops->send)
1161 		return NULL;
1162 
1163 	if (!supported_protocols)
1164 		return NULL;
1165 
1166 	ndev = kzalloc(sizeof(struct nci_dev), GFP_KERNEL);
1167 	if (!ndev)
1168 		return NULL;
1169 
1170 	ndev->ops = ops;
1171 
1172 	if (ops->n_prop_ops > NCI_MAX_PROPRIETARY_CMD) {
1173 		pr_err("Too many proprietary commands: %zd\n",
1174 		       ops->n_prop_ops);
1175 		goto free_nci;
1176 	}
1177 
1178 	ndev->tx_headroom = tx_headroom;
1179 	ndev->tx_tailroom = tx_tailroom;
1180 	init_completion(&ndev->req_completion);
1181 
1182 	ndev->nfc_dev = nfc_allocate_device(&nci_nfc_ops,
1183 					    supported_protocols,
1184 					    tx_headroom + NCI_DATA_HDR_SIZE,
1185 					    tx_tailroom);
1186 	if (!ndev->nfc_dev)
1187 		goto free_nci;
1188 
1189 	ndev->hci_dev = nci_hci_allocate(ndev);
1190 	if (!ndev->hci_dev)
1191 		goto free_nfc;
1192 
1193 	nfc_set_drvdata(ndev->nfc_dev, ndev);
1194 
1195 	return ndev;
1196 
1197 free_nfc:
1198 	nfc_free_device(ndev->nfc_dev);
1199 free_nci:
1200 	kfree(ndev);
1201 	return NULL;
1202 }
1203 EXPORT_SYMBOL(nci_allocate_device);
1204 
1205 /**
1206  * nci_free_device - deallocate nci device
1207  *
1208  * @ndev: The nci device to deallocate
1209  */
nci_free_device(struct nci_dev * ndev)1210 void nci_free_device(struct nci_dev *ndev)
1211 {
1212 	nfc_free_device(ndev->nfc_dev);
1213 	nci_hci_deallocate(ndev);
1214 
1215 	/* drop partial rx data packet if present */
1216 	if (ndev->rx_data_reassembly)
1217 		kfree_skb(ndev->rx_data_reassembly);
1218 	kfree(ndev);
1219 }
1220 EXPORT_SYMBOL(nci_free_device);
1221 
1222 /**
1223  * nci_register_device - register a nci device in the nfc subsystem
1224  *
1225  * @ndev: The nci device to register
1226  */
nci_register_device(struct nci_dev * ndev)1227 int nci_register_device(struct nci_dev *ndev)
1228 {
1229 	int rc;
1230 	struct device *dev = &ndev->nfc_dev->dev;
1231 	char name[32];
1232 
1233 	ndev->flags = 0;
1234 
1235 	INIT_WORK(&ndev->cmd_work, nci_cmd_work);
1236 	snprintf(name, sizeof(name), "%s_nci_cmd_wq", dev_name(dev));
1237 	ndev->cmd_wq = create_singlethread_workqueue(name);
1238 	if (!ndev->cmd_wq) {
1239 		rc = -ENOMEM;
1240 		goto exit;
1241 	}
1242 
1243 	INIT_WORK(&ndev->rx_work, nci_rx_work);
1244 	snprintf(name, sizeof(name), "%s_nci_rx_wq", dev_name(dev));
1245 	ndev->rx_wq = create_singlethread_workqueue(name);
1246 	if (!ndev->rx_wq) {
1247 		rc = -ENOMEM;
1248 		goto destroy_cmd_wq_exit;
1249 	}
1250 
1251 	INIT_WORK(&ndev->tx_work, nci_tx_work);
1252 	snprintf(name, sizeof(name), "%s_nci_tx_wq", dev_name(dev));
1253 	ndev->tx_wq = create_singlethread_workqueue(name);
1254 	if (!ndev->tx_wq) {
1255 		rc = -ENOMEM;
1256 		goto destroy_rx_wq_exit;
1257 	}
1258 
1259 	skb_queue_head_init(&ndev->cmd_q);
1260 	skb_queue_head_init(&ndev->rx_q);
1261 	skb_queue_head_init(&ndev->tx_q);
1262 
1263 	timer_setup(&ndev->cmd_timer, nci_cmd_timer, 0);
1264 	timer_setup(&ndev->data_timer, nci_data_timer, 0);
1265 
1266 	mutex_init(&ndev->req_lock);
1267 	INIT_LIST_HEAD(&ndev->conn_info_list);
1268 
1269 	rc = nfc_register_device(ndev->nfc_dev);
1270 	if (rc)
1271 		goto destroy_tx_wq_exit;
1272 
1273 	goto exit;
1274 
1275 destroy_tx_wq_exit:
1276 	destroy_workqueue(ndev->tx_wq);
1277 
1278 destroy_rx_wq_exit:
1279 	destroy_workqueue(ndev->rx_wq);
1280 
1281 destroy_cmd_wq_exit:
1282 	destroy_workqueue(ndev->cmd_wq);
1283 
1284 exit:
1285 	return rc;
1286 }
1287 EXPORT_SYMBOL(nci_register_device);
1288 
1289 /**
1290  * nci_unregister_device - unregister a nci device in the nfc subsystem
1291  *
1292  * @ndev: The nci device to unregister
1293  */
nci_unregister_device(struct nci_dev * ndev)1294 void nci_unregister_device(struct nci_dev *ndev)
1295 {
1296 	struct nci_conn_info *conn_info, *n;
1297 
1298 	/* This set_bit is not protected with specialized barrier,
1299 	 * However, it is fine because the mutex_lock(&ndev->req_lock);
1300 	 * in nci_close_device() will help to emit one.
1301 	 */
1302 	set_bit(NCI_UNREG, &ndev->flags);
1303 
1304 	nci_close_device(ndev);
1305 
1306 	destroy_workqueue(ndev->cmd_wq);
1307 	destroy_workqueue(ndev->rx_wq);
1308 	destroy_workqueue(ndev->tx_wq);
1309 
1310 	list_for_each_entry_safe(conn_info, n, &ndev->conn_info_list, list) {
1311 		list_del(&conn_info->list);
1312 		/* conn_info is allocated with devm_kzalloc */
1313 	}
1314 
1315 	nfc_unregister_device(ndev->nfc_dev);
1316 }
1317 EXPORT_SYMBOL(nci_unregister_device);
1318 
1319 /**
1320  * nci_recv_frame - receive frame from NCI drivers
1321  *
1322  * @ndev: The nci device
1323  * @skb: The sk_buff to receive
1324  */
nci_recv_frame(struct nci_dev * ndev,struct sk_buff * skb)1325 int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb)
1326 {
1327 	pr_debug("len %d\n", skb->len);
1328 
1329 	if (!ndev || (!test_bit(NCI_UP, &ndev->flags) &&
1330 	    !test_bit(NCI_INIT, &ndev->flags))) {
1331 		kfree_skb(skb);
1332 		return -ENXIO;
1333 	}
1334 
1335 	/* Queue frame for rx worker thread */
1336 	skb_queue_tail(&ndev->rx_q, skb);
1337 	queue_work(ndev->rx_wq, &ndev->rx_work);
1338 
1339 	return 0;
1340 }
1341 EXPORT_SYMBOL(nci_recv_frame);
1342 
nci_send_frame(struct nci_dev * ndev,struct sk_buff * skb)1343 int nci_send_frame(struct nci_dev *ndev, struct sk_buff *skb)
1344 {
1345 	pr_debug("len %d\n", skb->len);
1346 
1347 	if (!ndev) {
1348 		kfree_skb(skb);
1349 		return -ENODEV;
1350 	}
1351 
1352 	/* Get rid of skb owner, prior to sending to the driver. */
1353 	skb_orphan(skb);
1354 
1355 	/* Send copy to sniffer */
1356 	nfc_send_to_raw_sock(ndev->nfc_dev, skb,
1357 			     RAW_PAYLOAD_NCI, NFC_DIRECTION_TX);
1358 
1359 	return ndev->ops->send(ndev, skb);
1360 }
1361 EXPORT_SYMBOL(nci_send_frame);
1362 
1363 /* Send NCI command */
nci_send_cmd(struct nci_dev * ndev,__u16 opcode,__u8 plen,const void * payload)1364 int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, const void *payload)
1365 {
1366 	struct nci_ctrl_hdr *hdr;
1367 	struct sk_buff *skb;
1368 
1369 	pr_debug("opcode 0x%x, plen %d\n", opcode, plen);
1370 
1371 	skb = nci_skb_alloc(ndev, (NCI_CTRL_HDR_SIZE + plen), GFP_KERNEL);
1372 	if (!skb) {
1373 		pr_err("no memory for command\n");
1374 		return -ENOMEM;
1375 	}
1376 
1377 	hdr = skb_put(skb, NCI_CTRL_HDR_SIZE);
1378 	hdr->gid = nci_opcode_gid(opcode);
1379 	hdr->oid = nci_opcode_oid(opcode);
1380 	hdr->plen = plen;
1381 
1382 	nci_mt_set((__u8 *)hdr, NCI_MT_CMD_PKT);
1383 	nci_pbf_set((__u8 *)hdr, NCI_PBF_LAST);
1384 
1385 	if (plen)
1386 		skb_put_data(skb, payload, plen);
1387 
1388 	skb_queue_tail(&ndev->cmd_q, skb);
1389 	queue_work(ndev->cmd_wq, &ndev->cmd_work);
1390 
1391 	return 0;
1392 }
1393 EXPORT_SYMBOL(nci_send_cmd);
1394 
1395 /* Proprietary commands API */
ops_cmd_lookup(const struct nci_driver_ops * ops,size_t n_ops,__u16 opcode)1396 static const struct nci_driver_ops *ops_cmd_lookup(const struct nci_driver_ops *ops,
1397 						   size_t n_ops,
1398 						   __u16 opcode)
1399 {
1400 	size_t i;
1401 	const struct nci_driver_ops *op;
1402 
1403 	if (!ops || !n_ops)
1404 		return NULL;
1405 
1406 	for (i = 0; i < n_ops; i++) {
1407 		op = &ops[i];
1408 		if (op->opcode == opcode)
1409 			return op;
1410 	}
1411 
1412 	return NULL;
1413 }
1414 
nci_op_rsp_packet(struct nci_dev * ndev,__u16 rsp_opcode,struct sk_buff * skb,const struct nci_driver_ops * ops,size_t n_ops)1415 static int nci_op_rsp_packet(struct nci_dev *ndev, __u16 rsp_opcode,
1416 			     struct sk_buff *skb, const struct nci_driver_ops *ops,
1417 			     size_t n_ops)
1418 {
1419 	const struct nci_driver_ops *op;
1420 
1421 	op = ops_cmd_lookup(ops, n_ops, rsp_opcode);
1422 	if (!op || !op->rsp)
1423 		return -ENOTSUPP;
1424 
1425 	return op->rsp(ndev, skb);
1426 }
1427 
nci_op_ntf_packet(struct nci_dev * ndev,__u16 ntf_opcode,struct sk_buff * skb,const struct nci_driver_ops * ops,size_t n_ops)1428 static int nci_op_ntf_packet(struct nci_dev *ndev, __u16 ntf_opcode,
1429 			     struct sk_buff *skb, const struct nci_driver_ops *ops,
1430 			     size_t n_ops)
1431 {
1432 	const struct nci_driver_ops *op;
1433 
1434 	op = ops_cmd_lookup(ops, n_ops, ntf_opcode);
1435 	if (!op || !op->ntf)
1436 		return -ENOTSUPP;
1437 
1438 	return op->ntf(ndev, skb);
1439 }
1440 
nci_prop_rsp_packet(struct nci_dev * ndev,__u16 opcode,struct sk_buff * skb)1441 int nci_prop_rsp_packet(struct nci_dev *ndev, __u16 opcode,
1442 			struct sk_buff *skb)
1443 {
1444 	return nci_op_rsp_packet(ndev, opcode, skb, ndev->ops->prop_ops,
1445 				 ndev->ops->n_prop_ops);
1446 }
1447 
nci_prop_ntf_packet(struct nci_dev * ndev,__u16 opcode,struct sk_buff * skb)1448 int nci_prop_ntf_packet(struct nci_dev *ndev, __u16 opcode,
1449 			struct sk_buff *skb)
1450 {
1451 	return nci_op_ntf_packet(ndev, opcode, skb, ndev->ops->prop_ops,
1452 				 ndev->ops->n_prop_ops);
1453 }
1454 
nci_core_rsp_packet(struct nci_dev * ndev,__u16 opcode,struct sk_buff * skb)1455 int nci_core_rsp_packet(struct nci_dev *ndev, __u16 opcode,
1456 			struct sk_buff *skb)
1457 {
1458 	return nci_op_rsp_packet(ndev, opcode, skb, ndev->ops->core_ops,
1459 				  ndev->ops->n_core_ops);
1460 }
1461 
nci_core_ntf_packet(struct nci_dev * ndev,__u16 opcode,struct sk_buff * skb)1462 int nci_core_ntf_packet(struct nci_dev *ndev, __u16 opcode,
1463 			struct sk_buff *skb)
1464 {
1465 	return nci_op_ntf_packet(ndev, opcode, skb, ndev->ops->core_ops,
1466 				 ndev->ops->n_core_ops);
1467 }
1468 
1469 /* ---- NCI TX Data worker thread ---- */
1470 
nci_tx_work(struct work_struct * work)1471 static void nci_tx_work(struct work_struct *work)
1472 {
1473 	struct nci_dev *ndev = container_of(work, struct nci_dev, tx_work);
1474 	struct nci_conn_info *conn_info;
1475 	struct sk_buff *skb;
1476 
1477 	conn_info = nci_get_conn_info_by_conn_id(ndev, ndev->cur_conn_id);
1478 	if (!conn_info)
1479 		return;
1480 
1481 	pr_debug("credits_cnt %d\n", atomic_read(&conn_info->credits_cnt));
1482 
1483 	/* Send queued tx data */
1484 	while (atomic_read(&conn_info->credits_cnt)) {
1485 		skb = skb_dequeue(&ndev->tx_q);
1486 		if (!skb)
1487 			return;
1488 
1489 		/* Check if data flow control is used */
1490 		if (atomic_read(&conn_info->credits_cnt) !=
1491 		    NCI_DATA_FLOW_CONTROL_NOT_USED)
1492 			atomic_dec(&conn_info->credits_cnt);
1493 
1494 		pr_debug("NCI TX: MT=data, PBF=%d, conn_id=%d, plen=%d\n",
1495 			 nci_pbf(skb->data),
1496 			 nci_conn_id(skb->data),
1497 			 nci_plen(skb->data));
1498 
1499 		nci_send_frame(ndev, skb);
1500 
1501 		mod_timer(&ndev->data_timer,
1502 			  jiffies + msecs_to_jiffies(NCI_DATA_TIMEOUT));
1503 	}
1504 }
1505 
1506 /* ----- NCI RX worker thread (data & control) ----- */
1507 
nci_rx_work(struct work_struct * work)1508 static void nci_rx_work(struct work_struct *work)
1509 {
1510 	struct nci_dev *ndev = container_of(work, struct nci_dev, rx_work);
1511 	struct sk_buff *skb;
1512 
1513 	while ((skb = skb_dequeue(&ndev->rx_q))) {
1514 
1515 		/* Send copy to sniffer */
1516 		nfc_send_to_raw_sock(ndev->nfc_dev, skb,
1517 				     RAW_PAYLOAD_NCI, NFC_DIRECTION_RX);
1518 
1519 		/* Process frame */
1520 		switch (nci_mt(skb->data)) {
1521 		case NCI_MT_RSP_PKT:
1522 			nci_rsp_packet(ndev, skb);
1523 			break;
1524 
1525 		case NCI_MT_NTF_PKT:
1526 			nci_ntf_packet(ndev, skb);
1527 			break;
1528 
1529 		case NCI_MT_DATA_PKT:
1530 			nci_rx_data_packet(ndev, skb);
1531 			break;
1532 
1533 		default:
1534 			pr_err("unknown MT 0x%x\n", nci_mt(skb->data));
1535 			kfree_skb(skb);
1536 			break;
1537 		}
1538 	}
1539 
1540 	/* check if a data exchange timeout has occurred */
1541 	if (test_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags)) {
1542 		/* complete the data exchange transaction, if exists */
1543 		if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags))
1544 			nci_data_exchange_complete(ndev, NULL,
1545 						   ndev->cur_conn_id,
1546 						   -ETIMEDOUT);
1547 
1548 		clear_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
1549 	}
1550 }
1551 
1552 /* ----- NCI TX CMD worker thread ----- */
1553 
nci_cmd_work(struct work_struct * work)1554 static void nci_cmd_work(struct work_struct *work)
1555 {
1556 	struct nci_dev *ndev = container_of(work, struct nci_dev, cmd_work);
1557 	struct sk_buff *skb;
1558 
1559 	pr_debug("cmd_cnt %d\n", atomic_read(&ndev->cmd_cnt));
1560 
1561 	/* Send queued command */
1562 	if (atomic_read(&ndev->cmd_cnt)) {
1563 		skb = skb_dequeue(&ndev->cmd_q);
1564 		if (!skb)
1565 			return;
1566 
1567 		atomic_dec(&ndev->cmd_cnt);
1568 
1569 		pr_debug("NCI TX: MT=cmd, PBF=%d, GID=0x%x, OID=0x%x, plen=%d\n",
1570 			 nci_pbf(skb->data),
1571 			 nci_opcode_gid(nci_opcode(skb->data)),
1572 			 nci_opcode_oid(nci_opcode(skb->data)),
1573 			 nci_plen(skb->data));
1574 
1575 		nci_send_frame(ndev, skb);
1576 
1577 		mod_timer(&ndev->cmd_timer,
1578 			  jiffies + msecs_to_jiffies(NCI_CMD_TIMEOUT));
1579 	}
1580 }
1581 
1582 MODULE_LICENSE("GPL");
1583