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