1 // SPDX-License-Identifier: GPL-2.0-only
3 * NFC hardware simulation driver
4 * Copyright (c) 2013, Intel Corporation.
7 #include <linux/device.h>
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/ctype.h>
11 #include <linux/debugfs.h>
12 #include <linux/nfc.h>
13 #include <net/nfc/nfc.h>
14 #include <net/nfc/digital.h>
16 #define NFCSIM_ERR(d, fmt, args...) nfc_err(&d->nfc_digital_dev->nfc_dev->dev, \
17 "%s: " fmt, __func__, ## args)
19 #define NFCSIM_DBG(d, fmt, args...) dev_dbg(&d->nfc_digital_dev->nfc_dev->dev, \
20 "%s: " fmt, __func__, ## args)
22 #define NFCSIM_VERSION "0.2"
24 #define NFCSIM_MODE_NONE 0
25 #define NFCSIM_MODE_INITIATOR 1
26 #define NFCSIM_MODE_TARGET 2
28 #define NFCSIM_CAPABILITIES (NFC_DIGITAL_DRV_CAPS_IN_CRC | \
29 NFC_DIGITAL_DRV_CAPS_TG_CRC)
32 struct nfc_digital_dev
*nfc_digital_dev
;
34 struct work_struct recv_work
;
35 struct delayed_work send_work
;
37 struct nfcsim_link
*link_in
;
38 struct nfcsim_link
*link_out
;
46 nfc_digital_cmd_complete_t cb
;
61 wait_queue_head_t recv_wait
;
65 static struct nfcsim_link
*nfcsim_link_new(void)
67 struct nfcsim_link
*link
;
69 link
= kzalloc(sizeof(struct nfcsim_link
), GFP_KERNEL
);
73 mutex_init(&link
->lock
);
74 init_waitqueue_head(&link
->recv_wait
);
79 static void nfcsim_link_free(struct nfcsim_link
*link
)
81 dev_kfree_skb(link
->skb
);
85 static void nfcsim_link_recv_wake(struct nfcsim_link
*link
)
88 wake_up_interruptible(&link
->recv_wait
);
91 static void nfcsim_link_set_skb(struct nfcsim_link
*link
, struct sk_buff
*skb
,
94 mutex_lock(&link
->lock
);
96 dev_kfree_skb(link
->skb
);
98 link
->rf_tech
= rf_tech
;
101 mutex_unlock(&link
->lock
);
104 static void nfcsim_link_recv_cancel(struct nfcsim_link
*link
)
106 mutex_lock(&link
->lock
);
108 link
->mode
= NFCSIM_MODE_NONE
;
110 mutex_unlock(&link
->lock
);
112 nfcsim_link_recv_wake(link
);
115 static void nfcsim_link_shutdown(struct nfcsim_link
*link
)
117 mutex_lock(&link
->lock
);
120 link
->mode
= NFCSIM_MODE_NONE
;
122 mutex_unlock(&link
->lock
);
124 nfcsim_link_recv_wake(link
);
127 static struct sk_buff
*nfcsim_link_recv_skb(struct nfcsim_link
*link
,
128 int timeout
, u8 rf_tech
, u8 mode
)
133 rc
= wait_event_interruptible_timeout(link
->recv_wait
,
135 msecs_to_jiffies(timeout
));
137 mutex_lock(&link
->lock
);
147 if (!skb
|| link
->rf_tech
!= rf_tech
|| link
->mode
== mode
) {
152 if (link
->shutdown
) {
158 mutex_unlock(&link
->lock
);
170 static void nfcsim_send_wq(struct work_struct
*work
)
172 struct nfcsim
*dev
= container_of(work
, struct nfcsim
, send_work
.work
);
175 * To effectively send data, the device just wake up its link_out which
176 * is the link_in of the peer device. The exchanged skb has already been
177 * stored in the dev->link_out through nfcsim_link_set_skb().
179 nfcsim_link_recv_wake(dev
->link_out
);
182 static void nfcsim_recv_wq(struct work_struct
*work
)
184 struct nfcsim
*dev
= container_of(work
, struct nfcsim
, recv_work
);
187 skb
= nfcsim_link_recv_skb(dev
->link_in
, dev
->recv_timeout
,
188 dev
->rf_tech
, dev
->mode
);
191 NFCSIM_ERR(dev
, "Device is down\n");
196 skb
= ERR_PTR(-ENODEV
);
199 dev
->cb(dev
->nfc_digital_dev
, dev
->arg
, skb
);
202 static int nfcsim_send(struct nfc_digital_dev
*ddev
, struct sk_buff
*skb
,
203 u16 timeout
, nfc_digital_cmd_complete_t cb
, void *arg
)
205 struct nfcsim
*dev
= nfc_digital_get_drvdata(ddev
);
209 NFCSIM_ERR(dev
, "Device is down\n");
213 dev
->recv_timeout
= timeout
;
217 schedule_work(&dev
->recv_work
);
219 if (dev
->dropframe
) {
220 NFCSIM_DBG(dev
, "dropping frame (out of %d)\n", dev
->dropframe
);
228 nfcsim_link_set_skb(dev
->link_out
, skb
, dev
->rf_tech
,
231 /* Add random delay (between 3 and 10 ms) before sending data */
232 get_random_bytes(&delay
, 1);
233 delay
= 3 + (delay
& 0x07);
235 schedule_delayed_work(&dev
->send_work
, msecs_to_jiffies(delay
));
241 static void nfcsim_abort_cmd(struct nfc_digital_dev
*ddev
)
243 struct nfcsim
*dev
= nfc_digital_get_drvdata(ddev
);
245 nfcsim_link_recv_cancel(dev
->link_in
);
248 static int nfcsim_switch_rf(struct nfc_digital_dev
*ddev
, bool on
)
250 struct nfcsim
*dev
= nfc_digital_get_drvdata(ddev
);
257 static int nfcsim_in_configure_hw(struct nfc_digital_dev
*ddev
,
260 struct nfcsim
*dev
= nfc_digital_get_drvdata(ddev
);
263 case NFC_DIGITAL_CONFIG_RF_TECH
:
265 dev
->mode
= NFCSIM_MODE_INITIATOR
;
266 dev
->rf_tech
= param
;
269 case NFC_DIGITAL_CONFIG_FRAMING
:
273 NFCSIM_ERR(dev
, "Invalid configuration type: %d\n", type
);
280 static int nfcsim_in_send_cmd(struct nfc_digital_dev
*ddev
,
281 struct sk_buff
*skb
, u16 timeout
,
282 nfc_digital_cmd_complete_t cb
, void *arg
)
284 return nfcsim_send(ddev
, skb
, timeout
, cb
, arg
);
287 static int nfcsim_tg_configure_hw(struct nfc_digital_dev
*ddev
,
290 struct nfcsim
*dev
= nfc_digital_get_drvdata(ddev
);
293 case NFC_DIGITAL_CONFIG_RF_TECH
:
295 dev
->mode
= NFCSIM_MODE_TARGET
;
296 dev
->rf_tech
= param
;
299 case NFC_DIGITAL_CONFIG_FRAMING
:
303 NFCSIM_ERR(dev
, "Invalid configuration type: %d\n", type
);
310 static int nfcsim_tg_send_cmd(struct nfc_digital_dev
*ddev
,
311 struct sk_buff
*skb
, u16 timeout
,
312 nfc_digital_cmd_complete_t cb
, void *arg
)
314 return nfcsim_send(ddev
, skb
, timeout
, cb
, arg
);
317 static int nfcsim_tg_listen(struct nfc_digital_dev
*ddev
, u16 timeout
,
318 nfc_digital_cmd_complete_t cb
, void *arg
)
320 return nfcsim_send(ddev
, NULL
, timeout
, cb
, arg
);
323 static struct nfc_digital_ops nfcsim_digital_ops
= {
324 .in_configure_hw
= nfcsim_in_configure_hw
,
325 .in_send_cmd
= nfcsim_in_send_cmd
,
327 .tg_listen
= nfcsim_tg_listen
,
328 .tg_configure_hw
= nfcsim_tg_configure_hw
,
329 .tg_send_cmd
= nfcsim_tg_send_cmd
,
331 .abort_cmd
= nfcsim_abort_cmd
,
332 .switch_rf
= nfcsim_switch_rf
,
335 static struct dentry
*nfcsim_debugfs_root
;
337 static void nfcsim_debugfs_init(void)
339 nfcsim_debugfs_root
= debugfs_create_dir("nfcsim", NULL
);
341 if (!nfcsim_debugfs_root
)
342 pr_err("Could not create debugfs entry\n");
346 static void nfcsim_debugfs_remove(void)
348 debugfs_remove_recursive(nfcsim_debugfs_root
);
351 static void nfcsim_debugfs_init_dev(struct nfcsim
*dev
)
353 struct dentry
*dev_dir
;
354 char devname
[5]; /* nfcX\0 */
358 if (!nfcsim_debugfs_root
) {
359 NFCSIM_ERR(dev
, "nfcsim debugfs not initialized\n");
363 idx
= dev
->nfc_digital_dev
->nfc_dev
->idx
;
364 n
= snprintf(devname
, sizeof(devname
), "nfc%d", idx
);
365 if (n
>= sizeof(devname
)) {
366 NFCSIM_ERR(dev
, "Could not compute dev name for dev %d\n", idx
);
370 dev_dir
= debugfs_create_dir(devname
, nfcsim_debugfs_root
);
372 NFCSIM_ERR(dev
, "Could not create debugfs entries for nfc%d\n",
377 debugfs_create_u8("dropframe", 0664, dev_dir
, &dev
->dropframe
);
380 static struct nfcsim
*nfcsim_device_new(struct nfcsim_link
*link_in
,
381 struct nfcsim_link
*link_out
)
386 dev
= kzalloc(sizeof(struct nfcsim
), GFP_KERNEL
);
388 return ERR_PTR(-ENOMEM
);
390 INIT_DELAYED_WORK(&dev
->send_work
, nfcsim_send_wq
);
391 INIT_WORK(&dev
->recv_work
, nfcsim_recv_wq
);
393 dev
->nfc_digital_dev
=
394 nfc_digital_allocate_device(&nfcsim_digital_ops
,
395 NFC_PROTO_NFC_DEP_MASK
,
398 if (!dev
->nfc_digital_dev
) {
400 return ERR_PTR(-ENOMEM
);
403 nfc_digital_set_drvdata(dev
->nfc_digital_dev
, dev
);
405 dev
->link_in
= link_in
;
406 dev
->link_out
= link_out
;
408 rc
= nfc_digital_register_device(dev
->nfc_digital_dev
);
410 pr_err("Could not register digital device (%d)\n", rc
);
411 nfc_digital_free_device(dev
->nfc_digital_dev
);
417 nfcsim_debugfs_init_dev(dev
);
422 static void nfcsim_device_free(struct nfcsim
*dev
)
424 nfc_digital_unregister_device(dev
->nfc_digital_dev
);
428 nfcsim_link_shutdown(dev
->link_in
);
430 cancel_delayed_work_sync(&dev
->send_work
);
431 cancel_work_sync(&dev
->recv_work
);
433 nfc_digital_free_device(dev
->nfc_digital_dev
);
438 static struct nfcsim
*dev0
;
439 static struct nfcsim
*dev1
;
441 static int __init
nfcsim_init(void)
443 struct nfcsim_link
*link0
, *link1
;
446 link0
= nfcsim_link_new();
447 link1
= nfcsim_link_new();
448 if (!link0
|| !link1
) {
453 nfcsim_debugfs_init();
455 dev0
= nfcsim_device_new(link0
, link1
);
461 dev1
= nfcsim_device_new(link1
, link0
);
463 nfcsim_device_free(dev0
);
469 pr_info("nfcsim " NFCSIM_VERSION
" initialized\n");
474 pr_err("Failed to initialize nfcsim driver (%d)\n", rc
);
477 nfcsim_link_free(link0
);
479 nfcsim_link_free(link1
);
484 static void __exit
nfcsim_exit(void)
486 struct nfcsim_link
*link0
, *link1
;
488 link0
= dev0
->link_in
;
489 link1
= dev0
->link_out
;
491 nfcsim_device_free(dev0
);
492 nfcsim_device_free(dev1
);
494 nfcsim_link_free(link0
);
495 nfcsim_link_free(link1
);
497 nfcsim_debugfs_remove();
500 module_init(nfcsim_init
);
501 module_exit(nfcsim_exit
);
503 MODULE_DESCRIPTION("NFCSim driver ver " NFCSIM_VERSION
);
504 MODULE_VERSION(NFCSIM_VERSION
);
505 MODULE_LICENSE("GPL");