1/*
2 * Copyright (C) 2011 Instituto Nokia de Tecnologia
3 *
4 * Authors:
5 *    Lauro Ramos Venancio <lauro.venancio@openbossa.org>
6 *    Aloisio Almeida Jr <aloisio.almeida@openbossa.org>
7 *
8 * Vendor commands implementation based on net/wireless/nl80211.c
9 * which is:
10 *
11 * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
12 * Copyright 2013-2014  Intel Mobile Communications GmbH
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, see <http://www.gnu.org/licenses/>.
26 */
27
28#define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
29
30#include <net/genetlink.h>
31#include <linux/nfc.h>
32#include <linux/slab.h>
33
34#include "nfc.h"
35#include "llcp.h"
36
37static const struct genl_multicast_group nfc_genl_mcgrps[] = {
38	{ .name = NFC_GENL_MCAST_EVENT_NAME, },
39};
40
41static struct genl_family nfc_genl_family = {
42	.id = GENL_ID_GENERATE,
43	.hdrsize = 0,
44	.name = NFC_GENL_NAME,
45	.version = NFC_GENL_VERSION,
46	.maxattr = NFC_ATTR_MAX,
47};
48
49static const struct nla_policy nfc_genl_policy[NFC_ATTR_MAX + 1] = {
50	[NFC_ATTR_DEVICE_INDEX] = { .type = NLA_U32 },
51	[NFC_ATTR_DEVICE_NAME] = { .type = NLA_STRING,
52				.len = NFC_DEVICE_NAME_MAXSIZE },
53	[NFC_ATTR_PROTOCOLS] = { .type = NLA_U32 },
54	[NFC_ATTR_COMM_MODE] = { .type = NLA_U8 },
55	[NFC_ATTR_RF_MODE] = { .type = NLA_U8 },
56	[NFC_ATTR_DEVICE_POWERED] = { .type = NLA_U8 },
57	[NFC_ATTR_IM_PROTOCOLS] = { .type = NLA_U32 },
58	[NFC_ATTR_TM_PROTOCOLS] = { .type = NLA_U32 },
59	[NFC_ATTR_LLC_PARAM_LTO] = { .type = NLA_U8 },
60	[NFC_ATTR_LLC_PARAM_RW] = { .type = NLA_U8 },
61	[NFC_ATTR_LLC_PARAM_MIUX] = { .type = NLA_U16 },
62	[NFC_ATTR_LLC_SDP] = { .type = NLA_NESTED },
63	[NFC_ATTR_FIRMWARE_NAME] = { .type = NLA_STRING,
64				     .len = NFC_FIRMWARE_NAME_MAXSIZE },
65	[NFC_ATTR_SE_APDU] = { .type = NLA_BINARY },
66	[NFC_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
67
68};
69
70static const struct nla_policy nfc_sdp_genl_policy[NFC_SDP_ATTR_MAX + 1] = {
71	[NFC_SDP_ATTR_URI] = { .type = NLA_STRING },
72	[NFC_SDP_ATTR_SAP] = { .type = NLA_U8 },
73};
74
75static int nfc_genl_send_target(struct sk_buff *msg, struct nfc_target *target,
76				struct netlink_callback *cb, int flags)
77{
78	void *hdr;
79
80	hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
81			  &nfc_genl_family, flags, NFC_CMD_GET_TARGET);
82	if (!hdr)
83		return -EMSGSIZE;
84
85	genl_dump_check_consistent(cb, hdr, &nfc_genl_family);
86
87	if (nla_put_u32(msg, NFC_ATTR_TARGET_INDEX, target->idx) ||
88	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, target->supported_protocols) ||
89	    nla_put_u16(msg, NFC_ATTR_TARGET_SENS_RES, target->sens_res) ||
90	    nla_put_u8(msg, NFC_ATTR_TARGET_SEL_RES, target->sel_res))
91		goto nla_put_failure;
92	if (target->nfcid1_len > 0 &&
93	    nla_put(msg, NFC_ATTR_TARGET_NFCID1, target->nfcid1_len,
94		    target->nfcid1))
95		goto nla_put_failure;
96	if (target->sensb_res_len > 0 &&
97	    nla_put(msg, NFC_ATTR_TARGET_SENSB_RES, target->sensb_res_len,
98		    target->sensb_res))
99		goto nla_put_failure;
100	if (target->sensf_res_len > 0 &&
101	    nla_put(msg, NFC_ATTR_TARGET_SENSF_RES, target->sensf_res_len,
102		    target->sensf_res))
103		goto nla_put_failure;
104
105	if (target->is_iso15693) {
106		if (nla_put_u8(msg, NFC_ATTR_TARGET_ISO15693_DSFID,
107			       target->iso15693_dsfid) ||
108		    nla_put(msg, NFC_ATTR_TARGET_ISO15693_UID,
109			    sizeof(target->iso15693_uid), target->iso15693_uid))
110			goto nla_put_failure;
111	}
112
113	genlmsg_end(msg, hdr);
114	return 0;
115
116nla_put_failure:
117	genlmsg_cancel(msg, hdr);
118	return -EMSGSIZE;
119}
120
121static struct nfc_dev *__get_device_from_cb(struct netlink_callback *cb)
122{
123	struct nfc_dev *dev;
124	int rc;
125	u32 idx;
126
127	rc = nlmsg_parse(cb->nlh, GENL_HDRLEN + nfc_genl_family.hdrsize,
128			 nfc_genl_family.attrbuf,
129			 nfc_genl_family.maxattr,
130			 nfc_genl_policy);
131	if (rc < 0)
132		return ERR_PTR(rc);
133
134	if (!nfc_genl_family.attrbuf[NFC_ATTR_DEVICE_INDEX])
135		return ERR_PTR(-EINVAL);
136
137	idx = nla_get_u32(nfc_genl_family.attrbuf[NFC_ATTR_DEVICE_INDEX]);
138
139	dev = nfc_get_device(idx);
140	if (!dev)
141		return ERR_PTR(-ENODEV);
142
143	return dev;
144}
145
146static int nfc_genl_dump_targets(struct sk_buff *skb,
147				 struct netlink_callback *cb)
148{
149	int i = cb->args[0];
150	struct nfc_dev *dev = (struct nfc_dev *) cb->args[1];
151	int rc;
152
153	if (!dev) {
154		dev = __get_device_from_cb(cb);
155		if (IS_ERR(dev))
156			return PTR_ERR(dev);
157
158		cb->args[1] = (long) dev;
159	}
160
161	device_lock(&dev->dev);
162
163	cb->seq = dev->targets_generation;
164
165	while (i < dev->n_targets) {
166		rc = nfc_genl_send_target(skb, &dev->targets[i], cb,
167					  NLM_F_MULTI);
168		if (rc < 0)
169			break;
170
171		i++;
172	}
173
174	device_unlock(&dev->dev);
175
176	cb->args[0] = i;
177
178	return skb->len;
179}
180
181static int nfc_genl_dump_targets_done(struct netlink_callback *cb)
182{
183	struct nfc_dev *dev = (struct nfc_dev *) cb->args[1];
184
185	if (dev)
186		nfc_put_device(dev);
187
188	return 0;
189}
190
191int nfc_genl_targets_found(struct nfc_dev *dev)
192{
193	struct sk_buff *msg;
194	void *hdr;
195
196	dev->genl_data.poll_req_portid = 0;
197
198	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
199	if (!msg)
200		return -ENOMEM;
201
202	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
203			  NFC_EVENT_TARGETS_FOUND);
204	if (!hdr)
205		goto free_msg;
206
207	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
208		goto nla_put_failure;
209
210	genlmsg_end(msg, hdr);
211
212	return genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
213
214nla_put_failure:
215	genlmsg_cancel(msg, hdr);
216free_msg:
217	nlmsg_free(msg);
218	return -EMSGSIZE;
219}
220
221int nfc_genl_target_lost(struct nfc_dev *dev, u32 target_idx)
222{
223	struct sk_buff *msg;
224	void *hdr;
225
226	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
227	if (!msg)
228		return -ENOMEM;
229
230	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
231			  NFC_EVENT_TARGET_LOST);
232	if (!hdr)
233		goto free_msg;
234
235	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
236	    nla_put_u32(msg, NFC_ATTR_TARGET_INDEX, target_idx))
237		goto nla_put_failure;
238
239	genlmsg_end(msg, hdr);
240
241	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
242
243	return 0;
244
245nla_put_failure:
246	genlmsg_cancel(msg, hdr);
247free_msg:
248	nlmsg_free(msg);
249	return -EMSGSIZE;
250}
251
252int nfc_genl_tm_activated(struct nfc_dev *dev, u32 protocol)
253{
254	struct sk_buff *msg;
255	void *hdr;
256
257	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
258	if (!msg)
259		return -ENOMEM;
260
261	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
262			  NFC_EVENT_TM_ACTIVATED);
263	if (!hdr)
264		goto free_msg;
265
266	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
267		goto nla_put_failure;
268	if (nla_put_u32(msg, NFC_ATTR_TM_PROTOCOLS, protocol))
269		goto nla_put_failure;
270
271	genlmsg_end(msg, hdr);
272
273	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
274
275	return 0;
276
277nla_put_failure:
278	genlmsg_cancel(msg, hdr);
279free_msg:
280	nlmsg_free(msg);
281	return -EMSGSIZE;
282}
283
284int nfc_genl_tm_deactivated(struct nfc_dev *dev)
285{
286	struct sk_buff *msg;
287	void *hdr;
288
289	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
290	if (!msg)
291		return -ENOMEM;
292
293	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
294			  NFC_EVENT_TM_DEACTIVATED);
295	if (!hdr)
296		goto free_msg;
297
298	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
299		goto nla_put_failure;
300
301	genlmsg_end(msg, hdr);
302
303	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
304
305	return 0;
306
307nla_put_failure:
308	genlmsg_cancel(msg, hdr);
309free_msg:
310	nlmsg_free(msg);
311	return -EMSGSIZE;
312}
313
314int nfc_genl_device_added(struct nfc_dev *dev)
315{
316	struct sk_buff *msg;
317	void *hdr;
318
319	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
320	if (!msg)
321		return -ENOMEM;
322
323	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
324			  NFC_EVENT_DEVICE_ADDED);
325	if (!hdr)
326		goto free_msg;
327
328	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
329	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
330	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, dev->supported_protocols) ||
331	    nla_put_u8(msg, NFC_ATTR_DEVICE_POWERED, dev->dev_up))
332		goto nla_put_failure;
333
334	genlmsg_end(msg, hdr);
335
336	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
337
338	return 0;
339
340nla_put_failure:
341	genlmsg_cancel(msg, hdr);
342free_msg:
343	nlmsg_free(msg);
344	return -EMSGSIZE;
345}
346
347int nfc_genl_device_removed(struct nfc_dev *dev)
348{
349	struct sk_buff *msg;
350	void *hdr;
351
352	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
353	if (!msg)
354		return -ENOMEM;
355
356	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
357			  NFC_EVENT_DEVICE_REMOVED);
358	if (!hdr)
359		goto free_msg;
360
361	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
362		goto nla_put_failure;
363
364	genlmsg_end(msg, hdr);
365
366	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
367
368	return 0;
369
370nla_put_failure:
371	genlmsg_cancel(msg, hdr);
372free_msg:
373	nlmsg_free(msg);
374	return -EMSGSIZE;
375}
376
377int nfc_genl_llc_send_sdres(struct nfc_dev *dev, struct hlist_head *sdres_list)
378{
379	struct sk_buff *msg;
380	struct nlattr *sdp_attr, *uri_attr;
381	struct nfc_llcp_sdp_tlv *sdres;
382	struct hlist_node *n;
383	void *hdr;
384	int rc = -EMSGSIZE;
385	int i;
386
387	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
388	if (!msg)
389		return -ENOMEM;
390
391	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
392			  NFC_EVENT_LLC_SDRES);
393	if (!hdr)
394		goto free_msg;
395
396	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
397		goto nla_put_failure;
398
399	sdp_attr = nla_nest_start(msg, NFC_ATTR_LLC_SDP);
400	if (sdp_attr == NULL) {
401		rc = -ENOMEM;
402		goto nla_put_failure;
403	}
404
405	i = 1;
406	hlist_for_each_entry_safe(sdres, n, sdres_list, node) {
407		pr_debug("uri: %s, sap: %d\n", sdres->uri, sdres->sap);
408
409		uri_attr = nla_nest_start(msg, i++);
410		if (uri_attr == NULL) {
411			rc = -ENOMEM;
412			goto nla_put_failure;
413		}
414
415		if (nla_put_u8(msg, NFC_SDP_ATTR_SAP, sdres->sap))
416			goto nla_put_failure;
417
418		if (nla_put_string(msg, NFC_SDP_ATTR_URI, sdres->uri))
419			goto nla_put_failure;
420
421		nla_nest_end(msg, uri_attr);
422
423		hlist_del(&sdres->node);
424
425		nfc_llcp_free_sdp_tlv(sdres);
426	}
427
428	nla_nest_end(msg, sdp_attr);
429
430	genlmsg_end(msg, hdr);
431
432	return genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
433
434nla_put_failure:
435	genlmsg_cancel(msg, hdr);
436
437free_msg:
438	nlmsg_free(msg);
439
440	nfc_llcp_free_sdp_tlv_list(sdres_list);
441
442	return rc;
443}
444
445int nfc_genl_se_added(struct nfc_dev *dev, u32 se_idx, u16 type)
446{
447	struct sk_buff *msg;
448	void *hdr;
449
450	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
451	if (!msg)
452		return -ENOMEM;
453
454	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
455			  NFC_EVENT_SE_ADDED);
456	if (!hdr)
457		goto free_msg;
458
459	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
460	    nla_put_u32(msg, NFC_ATTR_SE_INDEX, se_idx) ||
461	    nla_put_u8(msg, NFC_ATTR_SE_TYPE, type))
462		goto nla_put_failure;
463
464	genlmsg_end(msg, hdr);
465
466	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
467
468	return 0;
469
470nla_put_failure:
471	genlmsg_cancel(msg, hdr);
472free_msg:
473	nlmsg_free(msg);
474	return -EMSGSIZE;
475}
476
477int nfc_genl_se_removed(struct nfc_dev *dev, u32 se_idx)
478{
479	struct sk_buff *msg;
480	void *hdr;
481
482	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
483	if (!msg)
484		return -ENOMEM;
485
486	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
487			  NFC_EVENT_SE_REMOVED);
488	if (!hdr)
489		goto free_msg;
490
491	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
492	    nla_put_u32(msg, NFC_ATTR_SE_INDEX, se_idx))
493		goto nla_put_failure;
494
495	genlmsg_end(msg, hdr);
496
497	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
498
499	return 0;
500
501nla_put_failure:
502	genlmsg_cancel(msg, hdr);
503free_msg:
504	nlmsg_free(msg);
505	return -EMSGSIZE;
506}
507
508int nfc_genl_se_transaction(struct nfc_dev *dev, u8 se_idx,
509			    struct nfc_evt_transaction *evt_transaction)
510{
511	struct nfc_se *se;
512	struct sk_buff *msg;
513	void *hdr;
514
515	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
516	if (!msg)
517		return -ENOMEM;
518
519	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
520			  NFC_EVENT_SE_TRANSACTION);
521	if (!hdr)
522		goto free_msg;
523
524	se = nfc_find_se(dev, se_idx);
525	if (!se)
526		goto free_msg;
527
528	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
529	    nla_put_u32(msg, NFC_ATTR_SE_INDEX, se_idx) ||
530	    nla_put_u8(msg, NFC_ATTR_SE_TYPE, se->type) ||
531	    nla_put(msg, NFC_ATTR_SE_AID, evt_transaction->aid_len,
532		    evt_transaction->aid) ||
533	    nla_put(msg, NFC_ATTR_SE_PARAMS, evt_transaction->params_len,
534		    evt_transaction->params))
535		goto nla_put_failure;
536
537	/* evt_transaction is no more used */
538	devm_kfree(&dev->dev, evt_transaction);
539
540	genlmsg_end(msg, hdr);
541
542	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
543
544	return 0;
545
546nla_put_failure:
547	genlmsg_cancel(msg, hdr);
548free_msg:
549	/* evt_transaction is no more used */
550	devm_kfree(&dev->dev, evt_transaction);
551	nlmsg_free(msg);
552	return -EMSGSIZE;
553}
554
555static int nfc_genl_send_device(struct sk_buff *msg, struct nfc_dev *dev,
556				u32 portid, u32 seq,
557				struct netlink_callback *cb,
558				int flags)
559{
560	void *hdr;
561
562	hdr = genlmsg_put(msg, portid, seq, &nfc_genl_family, flags,
563			  NFC_CMD_GET_DEVICE);
564	if (!hdr)
565		return -EMSGSIZE;
566
567	if (cb)
568		genl_dump_check_consistent(cb, hdr, &nfc_genl_family);
569
570	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
571	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
572	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, dev->supported_protocols) ||
573	    nla_put_u8(msg, NFC_ATTR_DEVICE_POWERED, dev->dev_up) ||
574	    nla_put_u8(msg, NFC_ATTR_RF_MODE, dev->rf_mode))
575		goto nla_put_failure;
576
577	genlmsg_end(msg, hdr);
578	return 0;
579
580nla_put_failure:
581	genlmsg_cancel(msg, hdr);
582	return -EMSGSIZE;
583}
584
585static int nfc_genl_dump_devices(struct sk_buff *skb,
586				 struct netlink_callback *cb)
587{
588	struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
589	struct nfc_dev *dev = (struct nfc_dev *) cb->args[1];
590	bool first_call = false;
591
592	if (!iter) {
593		first_call = true;
594		iter = kmalloc(sizeof(struct class_dev_iter), GFP_KERNEL);
595		if (!iter)
596			return -ENOMEM;
597		cb->args[0] = (long) iter;
598	}
599
600	mutex_lock(&nfc_devlist_mutex);
601
602	cb->seq = nfc_devlist_generation;
603
604	if (first_call) {
605		nfc_device_iter_init(iter);
606		dev = nfc_device_iter_next(iter);
607	}
608
609	while (dev) {
610		int rc;
611
612		rc = nfc_genl_send_device(skb, dev, NETLINK_CB(cb->skb).portid,
613					  cb->nlh->nlmsg_seq, cb, NLM_F_MULTI);
614		if (rc < 0)
615			break;
616
617		dev = nfc_device_iter_next(iter);
618	}
619
620	mutex_unlock(&nfc_devlist_mutex);
621
622	cb->args[1] = (long) dev;
623
624	return skb->len;
625}
626
627static int nfc_genl_dump_devices_done(struct netlink_callback *cb)
628{
629	struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
630
631	nfc_device_iter_exit(iter);
632	kfree(iter);
633
634	return 0;
635}
636
637int nfc_genl_dep_link_up_event(struct nfc_dev *dev, u32 target_idx,
638			       u8 comm_mode, u8 rf_mode)
639{
640	struct sk_buff *msg;
641	void *hdr;
642
643	pr_debug("DEP link is up\n");
644
645	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
646	if (!msg)
647		return -ENOMEM;
648
649	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0, NFC_CMD_DEP_LINK_UP);
650	if (!hdr)
651		goto free_msg;
652
653	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
654		goto nla_put_failure;
655	if (rf_mode == NFC_RF_INITIATOR &&
656	    nla_put_u32(msg, NFC_ATTR_TARGET_INDEX, target_idx))
657		goto nla_put_failure;
658	if (nla_put_u8(msg, NFC_ATTR_COMM_MODE, comm_mode) ||
659	    nla_put_u8(msg, NFC_ATTR_RF_MODE, rf_mode))
660		goto nla_put_failure;
661
662	genlmsg_end(msg, hdr);
663
664	dev->dep_link_up = true;
665
666	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
667
668	return 0;
669
670nla_put_failure:
671	genlmsg_cancel(msg, hdr);
672free_msg:
673	nlmsg_free(msg);
674	return -EMSGSIZE;
675}
676
677int nfc_genl_dep_link_down_event(struct nfc_dev *dev)
678{
679	struct sk_buff *msg;
680	void *hdr;
681
682	pr_debug("DEP link is down\n");
683
684	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
685	if (!msg)
686		return -ENOMEM;
687
688	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
689			  NFC_CMD_DEP_LINK_DOWN);
690	if (!hdr)
691		goto free_msg;
692
693	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
694		goto nla_put_failure;
695
696	genlmsg_end(msg, hdr);
697
698	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
699
700	return 0;
701
702nla_put_failure:
703	genlmsg_cancel(msg, hdr);
704free_msg:
705	nlmsg_free(msg);
706	return -EMSGSIZE;
707}
708
709static int nfc_genl_get_device(struct sk_buff *skb, struct genl_info *info)
710{
711	struct sk_buff *msg;
712	struct nfc_dev *dev;
713	u32 idx;
714	int rc = -ENOBUFS;
715
716	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
717		return -EINVAL;
718
719	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
720
721	dev = nfc_get_device(idx);
722	if (!dev)
723		return -ENODEV;
724
725	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
726	if (!msg) {
727		rc = -ENOMEM;
728		goto out_putdev;
729	}
730
731	rc = nfc_genl_send_device(msg, dev, info->snd_portid, info->snd_seq,
732				  NULL, 0);
733	if (rc < 0)
734		goto out_free;
735
736	nfc_put_device(dev);
737
738	return genlmsg_reply(msg, info);
739
740out_free:
741	nlmsg_free(msg);
742out_putdev:
743	nfc_put_device(dev);
744	return rc;
745}
746
747static int nfc_genl_dev_up(struct sk_buff *skb, struct genl_info *info)
748{
749	struct nfc_dev *dev;
750	int rc;
751	u32 idx;
752
753	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
754		return -EINVAL;
755
756	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
757
758	dev = nfc_get_device(idx);
759	if (!dev)
760		return -ENODEV;
761
762	rc = nfc_dev_up(dev);
763
764	nfc_put_device(dev);
765	return rc;
766}
767
768static int nfc_genl_dev_down(struct sk_buff *skb, struct genl_info *info)
769{
770	struct nfc_dev *dev;
771	int rc;
772	u32 idx;
773
774	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
775		return -EINVAL;
776
777	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
778
779	dev = nfc_get_device(idx);
780	if (!dev)
781		return -ENODEV;
782
783	rc = nfc_dev_down(dev);
784
785	nfc_put_device(dev);
786	return rc;
787}
788
789static int nfc_genl_start_poll(struct sk_buff *skb, struct genl_info *info)
790{
791	struct nfc_dev *dev;
792	int rc;
793	u32 idx;
794	u32 im_protocols = 0, tm_protocols = 0;
795
796	pr_debug("Poll start\n");
797
798	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
799	    ((!info->attrs[NFC_ATTR_IM_PROTOCOLS] &&
800	      !info->attrs[NFC_ATTR_PROTOCOLS]) &&
801	      !info->attrs[NFC_ATTR_TM_PROTOCOLS]))
802		return -EINVAL;
803
804	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
805
806	if (info->attrs[NFC_ATTR_TM_PROTOCOLS])
807		tm_protocols = nla_get_u32(info->attrs[NFC_ATTR_TM_PROTOCOLS]);
808
809	if (info->attrs[NFC_ATTR_IM_PROTOCOLS])
810		im_protocols = nla_get_u32(info->attrs[NFC_ATTR_IM_PROTOCOLS]);
811	else if (info->attrs[NFC_ATTR_PROTOCOLS])
812		im_protocols = nla_get_u32(info->attrs[NFC_ATTR_PROTOCOLS]);
813
814	dev = nfc_get_device(idx);
815	if (!dev)
816		return -ENODEV;
817
818	mutex_lock(&dev->genl_data.genl_data_mutex);
819
820	rc = nfc_start_poll(dev, im_protocols, tm_protocols);
821	if (!rc)
822		dev->genl_data.poll_req_portid = info->snd_portid;
823
824	mutex_unlock(&dev->genl_data.genl_data_mutex);
825
826	nfc_put_device(dev);
827	return rc;
828}
829
830static int nfc_genl_stop_poll(struct sk_buff *skb, struct genl_info *info)
831{
832	struct nfc_dev *dev;
833	int rc;
834	u32 idx;
835
836	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
837		return -EINVAL;
838
839	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
840
841	dev = nfc_get_device(idx);
842	if (!dev)
843		return -ENODEV;
844
845	device_lock(&dev->dev);
846
847	if (!dev->polling) {
848		device_unlock(&dev->dev);
849		return -EINVAL;
850	}
851
852	device_unlock(&dev->dev);
853
854	mutex_lock(&dev->genl_data.genl_data_mutex);
855
856	if (dev->genl_data.poll_req_portid != info->snd_portid) {
857		rc = -EBUSY;
858		goto out;
859	}
860
861	rc = nfc_stop_poll(dev);
862	dev->genl_data.poll_req_portid = 0;
863
864out:
865	mutex_unlock(&dev->genl_data.genl_data_mutex);
866	nfc_put_device(dev);
867	return rc;
868}
869
870static int nfc_genl_activate_target(struct sk_buff *skb, struct genl_info *info)
871{
872	struct nfc_dev *dev;
873	u32 device_idx, target_idx, protocol;
874	int rc;
875
876	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
877		return -EINVAL;
878
879	device_idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
880
881	dev = nfc_get_device(device_idx);
882	if (!dev)
883		return -ENODEV;
884
885	target_idx = nla_get_u32(info->attrs[NFC_ATTR_TARGET_INDEX]);
886	protocol = nla_get_u32(info->attrs[NFC_ATTR_PROTOCOLS]);
887
888	nfc_deactivate_target(dev, target_idx, NFC_TARGET_MODE_SLEEP);
889	rc = nfc_activate_target(dev, target_idx, protocol);
890
891	nfc_put_device(dev);
892	return 0;
893}
894
895static int nfc_genl_dep_link_up(struct sk_buff *skb, struct genl_info *info)
896{
897	struct nfc_dev *dev;
898	int rc, tgt_idx;
899	u32 idx;
900	u8 comm;
901
902	pr_debug("DEP link up\n");
903
904	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
905	    !info->attrs[NFC_ATTR_COMM_MODE])
906		return -EINVAL;
907
908	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
909	if (!info->attrs[NFC_ATTR_TARGET_INDEX])
910		tgt_idx = NFC_TARGET_IDX_ANY;
911	else
912		tgt_idx = nla_get_u32(info->attrs[NFC_ATTR_TARGET_INDEX]);
913
914	comm = nla_get_u8(info->attrs[NFC_ATTR_COMM_MODE]);
915
916	if (comm != NFC_COMM_ACTIVE && comm != NFC_COMM_PASSIVE)
917		return -EINVAL;
918
919	dev = nfc_get_device(idx);
920	if (!dev)
921		return -ENODEV;
922
923	rc = nfc_dep_link_up(dev, tgt_idx, comm);
924
925	nfc_put_device(dev);
926
927	return rc;
928}
929
930static int nfc_genl_dep_link_down(struct sk_buff *skb, struct genl_info *info)
931{
932	struct nfc_dev *dev;
933	int rc;
934	u32 idx;
935
936	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
937		return -EINVAL;
938
939	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
940
941	dev = nfc_get_device(idx);
942	if (!dev)
943		return -ENODEV;
944
945	rc = nfc_dep_link_down(dev);
946
947	nfc_put_device(dev);
948	return rc;
949}
950
951static int nfc_genl_send_params(struct sk_buff *msg,
952				struct nfc_llcp_local *local,
953				u32 portid, u32 seq)
954{
955	void *hdr;
956
957	hdr = genlmsg_put(msg, portid, seq, &nfc_genl_family, 0,
958			  NFC_CMD_LLC_GET_PARAMS);
959	if (!hdr)
960		return -EMSGSIZE;
961
962	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, local->dev->idx) ||
963	    nla_put_u8(msg, NFC_ATTR_LLC_PARAM_LTO, local->lto) ||
964	    nla_put_u8(msg, NFC_ATTR_LLC_PARAM_RW, local->rw) ||
965	    nla_put_u16(msg, NFC_ATTR_LLC_PARAM_MIUX, be16_to_cpu(local->miux)))
966		goto nla_put_failure;
967
968	genlmsg_end(msg, hdr);
969	return 0;
970
971nla_put_failure:
972
973	genlmsg_cancel(msg, hdr);
974	return -EMSGSIZE;
975}
976
977static int nfc_genl_llc_get_params(struct sk_buff *skb, struct genl_info *info)
978{
979	struct nfc_dev *dev;
980	struct nfc_llcp_local *local;
981	int rc = 0;
982	struct sk_buff *msg = NULL;
983	u32 idx;
984
985	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
986		return -EINVAL;
987
988	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
989
990	dev = nfc_get_device(idx);
991	if (!dev)
992		return -ENODEV;
993
994	device_lock(&dev->dev);
995
996	local = nfc_llcp_find_local(dev);
997	if (!local) {
998		rc = -ENODEV;
999		goto exit;
1000	}
1001
1002	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1003	if (!msg) {
1004		rc = -ENOMEM;
1005		goto exit;
1006	}
1007
1008	rc = nfc_genl_send_params(msg, local, info->snd_portid, info->snd_seq);
1009
1010exit:
1011	device_unlock(&dev->dev);
1012
1013	nfc_put_device(dev);
1014
1015	if (rc < 0) {
1016		if (msg)
1017			nlmsg_free(msg);
1018
1019		return rc;
1020	}
1021
1022	return genlmsg_reply(msg, info);
1023}
1024
1025static int nfc_genl_llc_set_params(struct sk_buff *skb, struct genl_info *info)
1026{
1027	struct nfc_dev *dev;
1028	struct nfc_llcp_local *local;
1029	u8 rw = 0;
1030	u16 miux = 0;
1031	u32 idx;
1032	int rc = 0;
1033
1034	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1035	    (!info->attrs[NFC_ATTR_LLC_PARAM_LTO] &&
1036	     !info->attrs[NFC_ATTR_LLC_PARAM_RW] &&
1037	     !info->attrs[NFC_ATTR_LLC_PARAM_MIUX]))
1038		return -EINVAL;
1039
1040	if (info->attrs[NFC_ATTR_LLC_PARAM_RW]) {
1041		rw = nla_get_u8(info->attrs[NFC_ATTR_LLC_PARAM_RW]);
1042
1043		if (rw > LLCP_MAX_RW)
1044			return -EINVAL;
1045	}
1046
1047	if (info->attrs[NFC_ATTR_LLC_PARAM_MIUX]) {
1048		miux = nla_get_u16(info->attrs[NFC_ATTR_LLC_PARAM_MIUX]);
1049
1050		if (miux > LLCP_MAX_MIUX)
1051			return -EINVAL;
1052	}
1053
1054	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1055
1056	dev = nfc_get_device(idx);
1057	if (!dev)
1058		return -ENODEV;
1059
1060	device_lock(&dev->dev);
1061
1062	local = nfc_llcp_find_local(dev);
1063	if (!local) {
1064		nfc_put_device(dev);
1065		rc = -ENODEV;
1066		goto exit;
1067	}
1068
1069	if (info->attrs[NFC_ATTR_LLC_PARAM_LTO]) {
1070		if (dev->dep_link_up) {
1071			rc = -EINPROGRESS;
1072			goto exit;
1073		}
1074
1075		local->lto = nla_get_u8(info->attrs[NFC_ATTR_LLC_PARAM_LTO]);
1076	}
1077
1078	if (info->attrs[NFC_ATTR_LLC_PARAM_RW])
1079		local->rw = rw;
1080
1081	if (info->attrs[NFC_ATTR_LLC_PARAM_MIUX])
1082		local->miux = cpu_to_be16(miux);
1083
1084exit:
1085	device_unlock(&dev->dev);
1086
1087	nfc_put_device(dev);
1088
1089	return rc;
1090}
1091
1092static int nfc_genl_llc_sdreq(struct sk_buff *skb, struct genl_info *info)
1093{
1094	struct nfc_dev *dev;
1095	struct nfc_llcp_local *local;
1096	struct nlattr *attr, *sdp_attrs[NFC_SDP_ATTR_MAX+1];
1097	u32 idx;
1098	u8 tid;
1099	char *uri;
1100	int rc = 0, rem;
1101	size_t uri_len, tlvs_len;
1102	struct hlist_head sdreq_list;
1103	struct nfc_llcp_sdp_tlv *sdreq;
1104
1105	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1106	    !info->attrs[NFC_ATTR_LLC_SDP])
1107		return -EINVAL;
1108
1109	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1110
1111	dev = nfc_get_device(idx);
1112	if (!dev)
1113		return -ENODEV;
1114
1115	device_lock(&dev->dev);
1116
1117	if (dev->dep_link_up == false) {
1118		rc = -ENOLINK;
1119		goto exit;
1120	}
1121
1122	local = nfc_llcp_find_local(dev);
1123	if (!local) {
1124		nfc_put_device(dev);
1125		rc = -ENODEV;
1126		goto exit;
1127	}
1128
1129	INIT_HLIST_HEAD(&sdreq_list);
1130
1131	tlvs_len = 0;
1132
1133	nla_for_each_nested(attr, info->attrs[NFC_ATTR_LLC_SDP], rem) {
1134		rc = nla_parse_nested(sdp_attrs, NFC_SDP_ATTR_MAX, attr,
1135				      nfc_sdp_genl_policy);
1136
1137		if (rc != 0) {
1138			rc = -EINVAL;
1139			goto exit;
1140		}
1141
1142		if (!sdp_attrs[NFC_SDP_ATTR_URI])
1143			continue;
1144
1145		uri_len = nla_len(sdp_attrs[NFC_SDP_ATTR_URI]);
1146		if (uri_len == 0)
1147			continue;
1148
1149		uri = nla_data(sdp_attrs[NFC_SDP_ATTR_URI]);
1150		if (uri == NULL || *uri == 0)
1151			continue;
1152
1153		tid = local->sdreq_next_tid++;
1154
1155		sdreq = nfc_llcp_build_sdreq_tlv(tid, uri, uri_len);
1156		if (sdreq == NULL) {
1157			rc = -ENOMEM;
1158			goto exit;
1159		}
1160
1161		tlvs_len += sdreq->tlv_len;
1162
1163		hlist_add_head(&sdreq->node, &sdreq_list);
1164	}
1165
1166	if (hlist_empty(&sdreq_list)) {
1167		rc = -EINVAL;
1168		goto exit;
1169	}
1170
1171	rc = nfc_llcp_send_snl_sdreq(local, &sdreq_list, tlvs_len);
1172exit:
1173	device_unlock(&dev->dev);
1174
1175	nfc_put_device(dev);
1176
1177	return rc;
1178}
1179
1180static int nfc_genl_fw_download(struct sk_buff *skb, struct genl_info *info)
1181{
1182	struct nfc_dev *dev;
1183	int rc;
1184	u32 idx;
1185	char firmware_name[NFC_FIRMWARE_NAME_MAXSIZE + 1];
1186
1187	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
1188		return -EINVAL;
1189
1190	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1191
1192	dev = nfc_get_device(idx);
1193	if (!dev)
1194		return -ENODEV;
1195
1196	nla_strlcpy(firmware_name, info->attrs[NFC_ATTR_FIRMWARE_NAME],
1197		    sizeof(firmware_name));
1198
1199	rc = nfc_fw_download(dev, firmware_name);
1200
1201	nfc_put_device(dev);
1202	return rc;
1203}
1204
1205int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name,
1206			      u32 result)
1207{
1208	struct sk_buff *msg;
1209	void *hdr;
1210
1211	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1212	if (!msg)
1213		return -ENOMEM;
1214
1215	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
1216			  NFC_CMD_FW_DOWNLOAD);
1217	if (!hdr)
1218		goto free_msg;
1219
1220	if (nla_put_string(msg, NFC_ATTR_FIRMWARE_NAME, firmware_name) ||
1221	    nla_put_u32(msg, NFC_ATTR_FIRMWARE_DOWNLOAD_STATUS, result) ||
1222	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
1223		goto nla_put_failure;
1224
1225	genlmsg_end(msg, hdr);
1226
1227	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
1228
1229	return 0;
1230
1231nla_put_failure:
1232	genlmsg_cancel(msg, hdr);
1233free_msg:
1234	nlmsg_free(msg);
1235	return -EMSGSIZE;
1236}
1237
1238static int nfc_genl_enable_se(struct sk_buff *skb, struct genl_info *info)
1239{
1240	struct nfc_dev *dev;
1241	int rc;
1242	u32 idx, se_idx;
1243
1244	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1245	    !info->attrs[NFC_ATTR_SE_INDEX])
1246		return -EINVAL;
1247
1248	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1249	se_idx = nla_get_u32(info->attrs[NFC_ATTR_SE_INDEX]);
1250
1251	dev = nfc_get_device(idx);
1252	if (!dev)
1253		return -ENODEV;
1254
1255	rc = nfc_enable_se(dev, se_idx);
1256
1257	nfc_put_device(dev);
1258	return rc;
1259}
1260
1261static int nfc_genl_disable_se(struct sk_buff *skb, struct genl_info *info)
1262{
1263	struct nfc_dev *dev;
1264	int rc;
1265	u32 idx, se_idx;
1266
1267	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1268	    !info->attrs[NFC_ATTR_SE_INDEX])
1269		return -EINVAL;
1270
1271	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1272	se_idx = nla_get_u32(info->attrs[NFC_ATTR_SE_INDEX]);
1273
1274	dev = nfc_get_device(idx);
1275	if (!dev)
1276		return -ENODEV;
1277
1278	rc = nfc_disable_se(dev, se_idx);
1279
1280	nfc_put_device(dev);
1281	return rc;
1282}
1283
1284static int nfc_genl_send_se(struct sk_buff *msg, struct nfc_dev *dev,
1285				u32 portid, u32 seq,
1286				struct netlink_callback *cb,
1287				int flags)
1288{
1289	void *hdr;
1290	struct nfc_se *se, *n;
1291
1292	list_for_each_entry_safe(se, n, &dev->secure_elements, list) {
1293		hdr = genlmsg_put(msg, portid, seq, &nfc_genl_family, flags,
1294				  NFC_CMD_GET_SE);
1295		if (!hdr)
1296			goto nla_put_failure;
1297
1298		if (cb)
1299			genl_dump_check_consistent(cb, hdr, &nfc_genl_family);
1300
1301		if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
1302		    nla_put_u32(msg, NFC_ATTR_SE_INDEX, se->idx) ||
1303		    nla_put_u8(msg, NFC_ATTR_SE_TYPE, se->type))
1304			goto nla_put_failure;
1305
1306		genlmsg_end(msg, hdr);
1307	}
1308
1309	return 0;
1310
1311nla_put_failure:
1312	genlmsg_cancel(msg, hdr);
1313	return -EMSGSIZE;
1314}
1315
1316static int nfc_genl_dump_ses(struct sk_buff *skb,
1317				 struct netlink_callback *cb)
1318{
1319	struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
1320	struct nfc_dev *dev = (struct nfc_dev *) cb->args[1];
1321	bool first_call = false;
1322
1323	if (!iter) {
1324		first_call = true;
1325		iter = kmalloc(sizeof(struct class_dev_iter), GFP_KERNEL);
1326		if (!iter)
1327			return -ENOMEM;
1328		cb->args[0] = (long) iter;
1329	}
1330
1331	mutex_lock(&nfc_devlist_mutex);
1332
1333	cb->seq = nfc_devlist_generation;
1334
1335	if (first_call) {
1336		nfc_device_iter_init(iter);
1337		dev = nfc_device_iter_next(iter);
1338	}
1339
1340	while (dev) {
1341		int rc;
1342
1343		rc = nfc_genl_send_se(skb, dev, NETLINK_CB(cb->skb).portid,
1344					  cb->nlh->nlmsg_seq, cb, NLM_F_MULTI);
1345		if (rc < 0)
1346			break;
1347
1348		dev = nfc_device_iter_next(iter);
1349	}
1350
1351	mutex_unlock(&nfc_devlist_mutex);
1352
1353	cb->args[1] = (long) dev;
1354
1355	return skb->len;
1356}
1357
1358static int nfc_genl_dump_ses_done(struct netlink_callback *cb)
1359{
1360	struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
1361
1362	nfc_device_iter_exit(iter);
1363	kfree(iter);
1364
1365	return 0;
1366}
1367
1368static int nfc_se_io(struct nfc_dev *dev, u32 se_idx,
1369		     u8 *apdu, size_t apdu_length,
1370		     se_io_cb_t cb, void *cb_context)
1371{
1372	struct nfc_se *se;
1373	int rc;
1374
1375	pr_debug("%s se index %d\n", dev_name(&dev->dev), se_idx);
1376
1377	device_lock(&dev->dev);
1378
1379	if (!device_is_registered(&dev->dev)) {
1380		rc = -ENODEV;
1381		goto error;
1382	}
1383
1384	if (!dev->dev_up) {
1385		rc = -ENODEV;
1386		goto error;
1387	}
1388
1389	if (!dev->ops->se_io) {
1390		rc = -EOPNOTSUPP;
1391		goto error;
1392	}
1393
1394	se = nfc_find_se(dev, se_idx);
1395	if (!se) {
1396		rc = -EINVAL;
1397		goto error;
1398	}
1399
1400	if (se->state != NFC_SE_ENABLED) {
1401		rc = -ENODEV;
1402		goto error;
1403	}
1404
1405	rc = dev->ops->se_io(dev, se_idx, apdu,
1406			apdu_length, cb, cb_context);
1407
1408error:
1409	device_unlock(&dev->dev);
1410	return rc;
1411}
1412
1413struct se_io_ctx {
1414	u32 dev_idx;
1415	u32 se_idx;
1416};
1417
1418static void se_io_cb(void *context, u8 *apdu, size_t apdu_len, int err)
1419{
1420	struct se_io_ctx *ctx = context;
1421	struct sk_buff *msg;
1422	void *hdr;
1423
1424	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1425	if (!msg) {
1426		kfree(ctx);
1427		return;
1428	}
1429
1430	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
1431			  NFC_CMD_SE_IO);
1432	if (!hdr)
1433		goto free_msg;
1434
1435	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, ctx->dev_idx) ||
1436	    nla_put_u32(msg, NFC_ATTR_SE_INDEX, ctx->se_idx) ||
1437	    nla_put(msg, NFC_ATTR_SE_APDU, apdu_len, apdu))
1438		goto nla_put_failure;
1439
1440	genlmsg_end(msg, hdr);
1441
1442	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
1443
1444	kfree(ctx);
1445
1446	return;
1447
1448nla_put_failure:
1449	genlmsg_cancel(msg, hdr);
1450free_msg:
1451	nlmsg_free(msg);
1452	kfree(ctx);
1453
1454	return;
1455}
1456
1457static int nfc_genl_se_io(struct sk_buff *skb, struct genl_info *info)
1458{
1459	struct nfc_dev *dev;
1460	struct se_io_ctx *ctx;
1461	u32 dev_idx, se_idx;
1462	u8 *apdu;
1463	size_t apdu_len;
1464
1465	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1466	    !info->attrs[NFC_ATTR_SE_INDEX] ||
1467	    !info->attrs[NFC_ATTR_SE_APDU])
1468		return -EINVAL;
1469
1470	dev_idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1471	se_idx = nla_get_u32(info->attrs[NFC_ATTR_SE_INDEX]);
1472
1473	dev = nfc_get_device(dev_idx);
1474	if (!dev)
1475		return -ENODEV;
1476
1477	if (!dev->ops || !dev->ops->se_io)
1478		return -ENOTSUPP;
1479
1480	apdu_len = nla_len(info->attrs[NFC_ATTR_SE_APDU]);
1481	if (apdu_len == 0)
1482		return -EINVAL;
1483
1484	apdu = nla_data(info->attrs[NFC_ATTR_SE_APDU]);
1485	if (!apdu)
1486		return -EINVAL;
1487
1488	ctx = kzalloc(sizeof(struct se_io_ctx), GFP_KERNEL);
1489	if (!ctx)
1490		return -ENOMEM;
1491
1492	ctx->dev_idx = dev_idx;
1493	ctx->se_idx = se_idx;
1494
1495	return nfc_se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx);
1496}
1497
1498static int nfc_genl_vendor_cmd(struct sk_buff *skb,
1499			       struct genl_info *info)
1500{
1501	struct nfc_dev *dev;
1502	struct nfc_vendor_cmd *cmd;
1503	u32 dev_idx, vid, subcmd;
1504	u8 *data;
1505	size_t data_len;
1506	int i, err;
1507
1508	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1509	    !info->attrs[NFC_ATTR_VENDOR_ID] ||
1510	    !info->attrs[NFC_ATTR_VENDOR_SUBCMD])
1511		return -EINVAL;
1512
1513	dev_idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1514	vid = nla_get_u32(info->attrs[NFC_ATTR_VENDOR_ID]);
1515	subcmd = nla_get_u32(info->attrs[NFC_ATTR_VENDOR_SUBCMD]);
1516
1517	dev = nfc_get_device(dev_idx);
1518	if (!dev || !dev->vendor_cmds || !dev->n_vendor_cmds)
1519		return -ENODEV;
1520
1521	if (info->attrs[NFC_ATTR_VENDOR_DATA]) {
1522		data = nla_data(info->attrs[NFC_ATTR_VENDOR_DATA]);
1523		data_len = nla_len(info->attrs[NFC_ATTR_VENDOR_DATA]);
1524		if (data_len == 0)
1525			return -EINVAL;
1526	} else {
1527		data = NULL;
1528		data_len = 0;
1529	}
1530
1531	for (i = 0; i < dev->n_vendor_cmds; i++) {
1532		cmd = &dev->vendor_cmds[i];
1533
1534		if (cmd->vendor_id != vid || cmd->subcmd != subcmd)
1535			continue;
1536
1537		dev->cur_cmd_info = info;
1538		err = cmd->doit(dev, data, data_len);
1539		dev->cur_cmd_info = NULL;
1540		return err;
1541	}
1542
1543	return -EOPNOTSUPP;
1544}
1545
1546/* message building helper */
1547static inline void *nfc_hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
1548				int flags, u8 cmd)
1549{
1550	/* since there is no private header just add the generic one */
1551	return genlmsg_put(skb, portid, seq, &nfc_genl_family, flags, cmd);
1552}
1553
1554static struct sk_buff *
1555__nfc_alloc_vendor_cmd_skb(struct nfc_dev *dev, int approxlen,
1556			   u32 portid, u32 seq,
1557			   enum nfc_attrs attr,
1558			   u32 oui, u32 subcmd, gfp_t gfp)
1559{
1560	struct sk_buff *skb;
1561	void *hdr;
1562
1563	skb = nlmsg_new(approxlen + 100, gfp);
1564	if (!skb)
1565		return NULL;
1566
1567	hdr = nfc_hdr_put(skb, portid, seq, 0, NFC_CMD_VENDOR);
1568	if (!hdr) {
1569		kfree_skb(skb);
1570		return NULL;
1571	}
1572
1573	if (nla_put_u32(skb, NFC_ATTR_DEVICE_INDEX, dev->idx))
1574		goto nla_put_failure;
1575	if (nla_put_u32(skb, NFC_ATTR_VENDOR_ID, oui))
1576		goto nla_put_failure;
1577	if (nla_put_u32(skb, NFC_ATTR_VENDOR_SUBCMD, subcmd))
1578		goto nla_put_failure;
1579
1580	((void **)skb->cb)[0] = dev;
1581	((void **)skb->cb)[1] = hdr;
1582
1583	return skb;
1584
1585nla_put_failure:
1586	kfree_skb(skb);
1587	return NULL;
1588}
1589
1590struct sk_buff *__nfc_alloc_vendor_cmd_reply_skb(struct nfc_dev *dev,
1591						 enum nfc_attrs attr,
1592						 u32 oui, u32 subcmd,
1593						 int approxlen)
1594{
1595	if (WARN_ON(!dev->cur_cmd_info))
1596		return NULL;
1597
1598	return __nfc_alloc_vendor_cmd_skb(dev, approxlen,
1599					  dev->cur_cmd_info->snd_portid,
1600					  dev->cur_cmd_info->snd_seq, attr,
1601					  oui, subcmd, GFP_KERNEL);
1602}
1603EXPORT_SYMBOL(__nfc_alloc_vendor_cmd_reply_skb);
1604
1605int nfc_vendor_cmd_reply(struct sk_buff *skb)
1606{
1607	struct nfc_dev *dev = ((void **)skb->cb)[0];
1608	void *hdr = ((void **)skb->cb)[1];
1609
1610	/* clear CB data for netlink core to own from now on */
1611	memset(skb->cb, 0, sizeof(skb->cb));
1612
1613	if (WARN_ON(!dev->cur_cmd_info)) {
1614		kfree_skb(skb);
1615		return -EINVAL;
1616	}
1617
1618	genlmsg_end(skb, hdr);
1619	return genlmsg_reply(skb, dev->cur_cmd_info);
1620}
1621EXPORT_SYMBOL(nfc_vendor_cmd_reply);
1622
1623static const struct genl_ops nfc_genl_ops[] = {
1624	{
1625		.cmd = NFC_CMD_GET_DEVICE,
1626		.doit = nfc_genl_get_device,
1627		.dumpit = nfc_genl_dump_devices,
1628		.done = nfc_genl_dump_devices_done,
1629		.policy = nfc_genl_policy,
1630	},
1631	{
1632		.cmd = NFC_CMD_DEV_UP,
1633		.doit = nfc_genl_dev_up,
1634		.policy = nfc_genl_policy,
1635	},
1636	{
1637		.cmd = NFC_CMD_DEV_DOWN,
1638		.doit = nfc_genl_dev_down,
1639		.policy = nfc_genl_policy,
1640	},
1641	{
1642		.cmd = NFC_CMD_START_POLL,
1643		.doit = nfc_genl_start_poll,
1644		.policy = nfc_genl_policy,
1645	},
1646	{
1647		.cmd = NFC_CMD_STOP_POLL,
1648		.doit = nfc_genl_stop_poll,
1649		.policy = nfc_genl_policy,
1650	},
1651	{
1652		.cmd = NFC_CMD_DEP_LINK_UP,
1653		.doit = nfc_genl_dep_link_up,
1654		.policy = nfc_genl_policy,
1655	},
1656	{
1657		.cmd = NFC_CMD_DEP_LINK_DOWN,
1658		.doit = nfc_genl_dep_link_down,
1659		.policy = nfc_genl_policy,
1660	},
1661	{
1662		.cmd = NFC_CMD_GET_TARGET,
1663		.dumpit = nfc_genl_dump_targets,
1664		.done = nfc_genl_dump_targets_done,
1665		.policy = nfc_genl_policy,
1666	},
1667	{
1668		.cmd = NFC_CMD_LLC_GET_PARAMS,
1669		.doit = nfc_genl_llc_get_params,
1670		.policy = nfc_genl_policy,
1671	},
1672	{
1673		.cmd = NFC_CMD_LLC_SET_PARAMS,
1674		.doit = nfc_genl_llc_set_params,
1675		.policy = nfc_genl_policy,
1676	},
1677	{
1678		.cmd = NFC_CMD_LLC_SDREQ,
1679		.doit = nfc_genl_llc_sdreq,
1680		.policy = nfc_genl_policy,
1681	},
1682	{
1683		.cmd = NFC_CMD_FW_DOWNLOAD,
1684		.doit = nfc_genl_fw_download,
1685		.policy = nfc_genl_policy,
1686	},
1687	{
1688		.cmd = NFC_CMD_ENABLE_SE,
1689		.doit = nfc_genl_enable_se,
1690		.policy = nfc_genl_policy,
1691	},
1692	{
1693		.cmd = NFC_CMD_DISABLE_SE,
1694		.doit = nfc_genl_disable_se,
1695		.policy = nfc_genl_policy,
1696	},
1697	{
1698		.cmd = NFC_CMD_GET_SE,
1699		.dumpit = nfc_genl_dump_ses,
1700		.done = nfc_genl_dump_ses_done,
1701		.policy = nfc_genl_policy,
1702	},
1703	{
1704		.cmd = NFC_CMD_SE_IO,
1705		.doit = nfc_genl_se_io,
1706		.policy = nfc_genl_policy,
1707	},
1708	{
1709		.cmd = NFC_CMD_ACTIVATE_TARGET,
1710		.doit = nfc_genl_activate_target,
1711		.policy = nfc_genl_policy,
1712	},
1713	{
1714		.cmd = NFC_CMD_VENDOR,
1715		.doit = nfc_genl_vendor_cmd,
1716		.policy = nfc_genl_policy,
1717	},
1718};
1719
1720
1721struct urelease_work {
1722	struct	work_struct w;
1723	u32	portid;
1724};
1725
1726static void nfc_urelease_event_work(struct work_struct *work)
1727{
1728	struct urelease_work *w = container_of(work, struct urelease_work, w);
1729	struct class_dev_iter iter;
1730	struct nfc_dev *dev;
1731
1732	pr_debug("portid %d\n", w->portid);
1733
1734	mutex_lock(&nfc_devlist_mutex);
1735
1736	nfc_device_iter_init(&iter);
1737	dev = nfc_device_iter_next(&iter);
1738
1739	while (dev) {
1740		mutex_lock(&dev->genl_data.genl_data_mutex);
1741
1742		if (dev->genl_data.poll_req_portid == w->portid) {
1743			nfc_stop_poll(dev);
1744			dev->genl_data.poll_req_portid = 0;
1745		}
1746
1747		mutex_unlock(&dev->genl_data.genl_data_mutex);
1748
1749		dev = nfc_device_iter_next(&iter);
1750	}
1751
1752	nfc_device_iter_exit(&iter);
1753
1754	mutex_unlock(&nfc_devlist_mutex);
1755
1756	kfree(w);
1757}
1758
1759static int nfc_genl_rcv_nl_event(struct notifier_block *this,
1760				 unsigned long event, void *ptr)
1761{
1762	struct netlink_notify *n = ptr;
1763	struct urelease_work *w;
1764
1765	if (event != NETLINK_URELEASE || n->protocol != NETLINK_GENERIC)
1766		goto out;
1767
1768	pr_debug("NETLINK_URELEASE event from id %d\n", n->portid);
1769
1770	w = kmalloc(sizeof(*w), GFP_ATOMIC);
1771	if (w) {
1772		INIT_WORK((struct work_struct *) w, nfc_urelease_event_work);
1773		w->portid = n->portid;
1774		schedule_work((struct work_struct *) w);
1775	}
1776
1777out:
1778	return NOTIFY_DONE;
1779}
1780
1781void nfc_genl_data_init(struct nfc_genl_data *genl_data)
1782{
1783	genl_data->poll_req_portid = 0;
1784	mutex_init(&genl_data->genl_data_mutex);
1785}
1786
1787void nfc_genl_data_exit(struct nfc_genl_data *genl_data)
1788{
1789	mutex_destroy(&genl_data->genl_data_mutex);
1790}
1791
1792static struct notifier_block nl_notifier = {
1793	.notifier_call  = nfc_genl_rcv_nl_event,
1794};
1795
1796/**
1797 * nfc_genl_init() - Initialize netlink interface
1798 *
1799 * This initialization function registers the nfc netlink family.
1800 */
1801int __init nfc_genl_init(void)
1802{
1803	int rc;
1804
1805	rc = genl_register_family_with_ops_groups(&nfc_genl_family,
1806						  nfc_genl_ops,
1807						  nfc_genl_mcgrps);
1808	if (rc)
1809		return rc;
1810
1811	netlink_register_notifier(&nl_notifier);
1812
1813	return 0;
1814}
1815
1816/**
1817 * nfc_genl_exit() - Deinitialize netlink interface
1818 *
1819 * This exit function unregisters the nfc netlink family.
1820 */
1821void nfc_genl_exit(void)
1822{
1823	netlink_unregister_notifier(&nl_notifier);
1824	genl_unregister_family(&nfc_genl_family);
1825}
1826