aboutsummaryrefslogtreecommitdiffstats
path: root/net/nfc
diff options
context:
space:
mode:
authorThierry Escande <thierry.escande@linux.intel.com>2013-09-19 11:55:25 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2013-09-24 19:35:42 -0400
commit4b10884eb428c243ae2070a539612e645f3d9b93 (patch)
tree1b80e5d3561f3cfd3d3a9cee926423f4de241fdc /net/nfc
parentcec4b8edc9c139ef658e2a26aa38a2a4b768aec6 (diff)
NFC: Digital Protocol stack implementation
This is the initial commit of the NFC Digital Protocol stack implementation. It offers an interface for devices that don't have an embedded NFC Digital protocol stack. The driver instantiates the digital stack by calling nfc_digital_allocate_device(). Within the nfc_digital_ops structure, the driver specifies a set of function pointers for driver operations. These functions must be implemented by the driver and are: in_configure_hw: Hardware configuration for RF technology and communication framing in initiator mode. This is a synchronous function. in_send_cmd: Initiator mode data exchange using RF technology and framing previously set with in_configure_hw. The peer response is returned through callback cb. If an io error occurs or the peer didn't reply within the specified timeout (ms), the error code is passed back through the resp pointer. This is an asynchronous function. tg_configure_hw: Hardware configuration for RF technology and communication framing in target mode. This is a synchronous function. tg_send_cmd: Target mode data exchange using RF technology and framing previously set with tg_configure_hw. The peer next command is returned through callback cb. If an io error occurs or the peer didn't reply within the specified timeout (ms), the error code is passed back through the resp pointer. This is an asynchronous function. tg_listen: Put the device in listen mode waiting for data from the peer device. This is an asynchronous function. tg_listen_mdaa: If supported, put the device in automatic listen mode with mode detection and automatic anti-collision. In this mode, the device automatically detects the RF technology and executes the anti-collision detection using the command responses specified in mdaa_params. The mdaa_params structure contains SENS_RES, NFCID1, and SEL_RES for 106A RF tech. NFCID2 and system code (sc) for 212F and 424F. The driver returns the NFC-DEP ATR_REQ command through cb. The digital stack deducts the RF tech by analyzing the SoD of the frame containing the ATR_REQ command. This is an asynchronous function. switch_rf: Turns device radio on or off. The stack does not call explicitly switch_rf to turn the radio on. A call to in|tg_configure_hw must turn the device radio on. abort_cmd: Discard the last sent command. Then the driver registers itself against the digital stack by using nfc_digital_register_device() which in turn registers the digital stack against the NFC core layer. The digital stack implements common NFC operations like dev_up(), dev_down(), start_poll(), stop_poll(), etc. This patch is only a skeleton and NFC operations are just stubs. Signed-off-by: Thierry Escande <thierry.escande@linux.intel.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc')
-rw-r--r--net/nfc/Kconfig12
-rw-r--r--net/nfc/Makefile2
-rw-r--r--net/nfc/digital.h27
-rw-r--r--net/nfc/digital_core.c151
4 files changed, 192 insertions, 0 deletions
diff --git a/net/nfc/Kconfig b/net/nfc/Kconfig
index 5948b2fc72f6..13e1237e1ea1 100644
--- a/net/nfc/Kconfig
+++ b/net/nfc/Kconfig
@@ -14,6 +14,18 @@ menuconfig NFC
14 To compile this support as a module, choose M here: the module will 14 To compile this support as a module, choose M here: the module will
15 be called nfc. 15 be called nfc.
16 16
17config NFC_DIGITAL
18 depends on NFC
19 tristate "NFC Digital Protocol stack support"
20 default n
21 help
22 Say Y if you want to build NFC digital protocol stack support.
23 This is needed by NFC chipsets whose firmware only implement
24 the NFC analog layer.
25
26 To compile this support as a module, choose M here: the module will
27 be called nfc_digital.
28
17source "net/nfc/nci/Kconfig" 29source "net/nfc/nci/Kconfig"
18source "net/nfc/hci/Kconfig" 30source "net/nfc/hci/Kconfig"
19 31
diff --git a/net/nfc/Makefile b/net/nfc/Makefile
index a76f4533cb6c..8e0cabd85e99 100644
--- a/net/nfc/Makefile
+++ b/net/nfc/Makefile
@@ -5,7 +5,9 @@
5obj-$(CONFIG_NFC) += nfc.o 5obj-$(CONFIG_NFC) += nfc.o
6obj-$(CONFIG_NFC_NCI) += nci/ 6obj-$(CONFIG_NFC_NCI) += nci/
7obj-$(CONFIG_NFC_HCI) += hci/ 7obj-$(CONFIG_NFC_HCI) += hci/
8obj-$(CONFIG_NFC_DIGITAL) += nfc_digital.o
8 9
9nfc-objs := core.o netlink.o af_nfc.o rawsock.o llcp_core.o llcp_commands.o \ 10nfc-objs := core.o netlink.o af_nfc.o rawsock.o llcp_core.o llcp_commands.o \
10 llcp_sock.o 11 llcp_sock.o
11 12
13nfc_digital-objs := digital_core.o
diff --git a/net/nfc/digital.h b/net/nfc/digital.h
new file mode 100644
index 000000000000..8d91ed820912
--- /dev/null
+++ b/net/nfc/digital.h
@@ -0,0 +1,27 @@
1/*
2 * NFC Digital Protocol stack
3 * Copyright (c) 2013, Intel Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 */
15
16#ifndef __DIGITAL_H
17#define __DIGITAL_H
18
19#include <net/nfc/nfc.h>
20#include <net/nfc/digital.h>
21
22#define PR_DBG(fmt, ...) pr_debug("%s: " fmt "\n", __func__, ##__VA_ARGS__)
23#define PR_ERR(fmt, ...) pr_err("%s: " fmt "\n", __func__, ##__VA_ARGS__)
24#define PROTOCOL_ERR(req) pr_err("%s:%d: NFC Digital Protocol error: %s\n", \
25 __func__, __LINE__, req)
26
27#endif /* __DIGITAL_H */
diff --git a/net/nfc/digital_core.c b/net/nfc/digital_core.c
new file mode 100644
index 000000000000..471188a0d2e0
--- /dev/null
+++ b/net/nfc/digital_core.c
@@ -0,0 +1,151 @@
1/*
2 * NFC Digital Protocol stack
3 * Copyright (c) 2013, Intel Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 */
15
16#include <linux/module.h>
17
18#include "digital.h"
19
20static int digital_start_poll(struct nfc_dev *nfc_dev, __u32 im_protocols,
21 __u32 tm_protocols)
22{
23 return -EOPNOTSUPP;
24}
25
26static void digital_stop_poll(struct nfc_dev *nfc_dev)
27{
28}
29
30static int digital_dev_up(struct nfc_dev *nfc_dev)
31{
32 return -EOPNOTSUPP;
33}
34
35static int digital_dev_down(struct nfc_dev *nfc_dev)
36{
37 return -EOPNOTSUPP;
38}
39
40static int digital_dep_link_up(struct nfc_dev *nfc_dev,
41 struct nfc_target *target,
42 __u8 comm_mode, __u8 *gb, size_t gb_len)
43{
44 return -EOPNOTSUPP;
45}
46
47static int digital_dep_link_down(struct nfc_dev *nfc_dev)
48{
49 return -EOPNOTSUPP;
50}
51
52static int digital_activate_target(struct nfc_dev *nfc_dev,
53 struct nfc_target *target, __u32 protocol)
54{
55 return -EOPNOTSUPP;
56}
57
58static void digital_deactivate_target(struct nfc_dev *nfc_dev,
59 struct nfc_target *target)
60{
61}
62
63static int digital_tg_send(struct nfc_dev *dev, struct sk_buff *skb)
64{
65 return -EOPNOTSUPP;
66}
67
68static int digital_in_send(struct nfc_dev *nfc_dev, struct nfc_target *target,
69 struct sk_buff *skb, data_exchange_cb_t cb,
70 void *cb_context)
71{
72 return -EOPNOTSUPP;
73}
74
75static struct nfc_ops digital_nfc_ops = {
76 .dev_up = digital_dev_up,
77 .dev_down = digital_dev_down,
78 .start_poll = digital_start_poll,
79 .stop_poll = digital_stop_poll,
80 .dep_link_up = digital_dep_link_up,
81 .dep_link_down = digital_dep_link_down,
82 .activate_target = digital_activate_target,
83 .deactivate_target = digital_deactivate_target,
84 .tm_send = digital_tg_send,
85 .im_transceive = digital_in_send,
86};
87
88struct nfc_digital_dev *nfc_digital_allocate_device(struct nfc_digital_ops *ops,
89 __u32 supported_protocols,
90 __u32 driver_capabilities,
91 int tx_headroom, int tx_tailroom)
92{
93 struct nfc_digital_dev *ddev;
94
95 if (!ops->in_configure_hw || !ops->in_send_cmd || !ops->tg_listen ||
96 !ops->tg_configure_hw || !ops->tg_send_cmd || !ops->abort_cmd ||
97 !ops->switch_rf)
98 return NULL;
99
100 ddev = kzalloc(sizeof(struct nfc_digital_dev), GFP_KERNEL);
101 if (!ddev) {
102 PR_ERR("kzalloc failed");
103 return NULL;
104 }
105
106 ddev->driver_capabilities = driver_capabilities;
107 ddev->ops = ops;
108
109 ddev->tx_headroom = tx_headroom;
110 ddev->tx_tailroom = tx_tailroom;
111
112 ddev->nfc_dev = nfc_allocate_device(&digital_nfc_ops, ddev->protocols,
113 ddev->tx_headroom,
114 ddev->tx_tailroom);
115 if (!ddev->nfc_dev) {
116 PR_ERR("nfc_allocate_device failed");
117 goto free_dev;
118 }
119
120 nfc_set_drvdata(ddev->nfc_dev, ddev);
121
122 return ddev;
123
124free_dev:
125 kfree(ddev);
126
127 return NULL;
128}
129EXPORT_SYMBOL(nfc_digital_allocate_device);
130
131void nfc_digital_free_device(struct nfc_digital_dev *ddev)
132{
133 nfc_free_device(ddev->nfc_dev);
134
135 kfree(ddev);
136}
137EXPORT_SYMBOL(nfc_digital_free_device);
138
139int nfc_digital_register_device(struct nfc_digital_dev *ddev)
140{
141 return nfc_register_device(ddev->nfc_dev);
142}
143EXPORT_SYMBOL(nfc_digital_register_device);
144
145void nfc_digital_unregister_device(struct nfc_digital_dev *ddev)
146{
147 nfc_unregister_device(ddev->nfc_dev);
148}
149EXPORT_SYMBOL(nfc_digital_unregister_device);
150
151MODULE_LICENSE("GPL");