Commit | Line | Data |
---|---|---|
4b10884e TE |
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 __NFC_DIGITAL_H | |
17 | #define __NFC_DIGITAL_H | |
18 | ||
19 | #include <linux/skbuff.h> | |
20 | #include <net/nfc/nfc.h> | |
21 | ||
22 | /** | |
23 | * Configuration types for in_configure_hw and tg_configure_hw. | |
24 | */ | |
25 | enum { | |
26 | NFC_DIGITAL_CONFIG_RF_TECH = 0, | |
27 | NFC_DIGITAL_CONFIG_FRAMING, | |
28 | }; | |
29 | ||
30 | /** | |
31 | * RF technology values passed as param argument to in_configure_hw and | |
32 | * tg_configure_hw for NFC_DIGITAL_CONFIG_RF_TECH configuration type. | |
33 | */ | |
34 | enum { | |
35 | NFC_DIGITAL_RF_TECH_106A = 0, | |
36 | NFC_DIGITAL_RF_TECH_212F, | |
37 | NFC_DIGITAL_RF_TECH_424F, | |
e487e4dc | 38 | NFC_DIGITAL_RF_TECH_ISO15693, |
4b10884e TE |
39 | |
40 | NFC_DIGITAL_RF_TECH_LAST, | |
41 | }; | |
42 | ||
43 | /** | |
44 | * Framing configuration passed as param argument to in_configure_hw and | |
45 | * tg_configure_hw for NFC_DIGITAL_CONFIG_FRAMING configuration type. | |
46 | */ | |
47 | enum { | |
48 | NFC_DIGITAL_FRAMING_NFCA_SHORT = 0, | |
49 | NFC_DIGITAL_FRAMING_NFCA_STANDARD, | |
50 | NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A, | |
51 | ||
52 | NFC_DIGITAL_FRAMING_NFCA_T1T, | |
53 | NFC_DIGITAL_FRAMING_NFCA_T2T, | |
12e3d241 | 54 | NFC_DIGITAL_FRAMING_NFCA_T4T, |
4b10884e TE |
55 | NFC_DIGITAL_FRAMING_NFCA_NFC_DEP, |
56 | ||
57 | NFC_DIGITAL_FRAMING_NFCF, | |
58 | NFC_DIGITAL_FRAMING_NFCF_T3T, | |
59 | NFC_DIGITAL_FRAMING_NFCF_NFC_DEP, | |
60 | NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED, | |
61 | ||
e487e4dc | 62 | NFC_DIGITAL_FRAMING_ISO15693_INVENTORY, |
ceeee42d | 63 | NFC_DIGITAL_FRAMING_ISO15693_T5T, |
e487e4dc | 64 | |
4b10884e TE |
65 | NFC_DIGITAL_FRAMING_LAST, |
66 | }; | |
67 | ||
68 | #define DIGITAL_MDAA_NFCID1_SIZE 3 | |
69 | ||
70 | struct digital_tg_mdaa_params { | |
71 | u16 sens_res; | |
72 | u8 nfcid1[DIGITAL_MDAA_NFCID1_SIZE]; | |
73 | u8 sel_res; | |
74 | ||
75 | u8 nfcid2[NFC_NFCID2_MAXSIZE]; | |
76 | u16 sc; | |
77 | }; | |
78 | ||
79 | struct nfc_digital_dev; | |
80 | ||
81 | /** | |
82 | * nfc_digital_cmd_complete_t - Definition of command result callback | |
83 | * | |
84 | * @ddev: nfc_digital_device ref | |
85 | * @arg: user data | |
86 | * @resp: response data | |
87 | * | |
88 | * resp pointer can be an error code and will be checked with IS_ERR() macro. | |
89 | * The callback is responsible for freeing resp sk_buff. | |
90 | */ | |
91 | typedef void (*nfc_digital_cmd_complete_t)(struct nfc_digital_dev *ddev, | |
92 | void *arg, struct sk_buff *resp); | |
93 | ||
94 | /** | |
95 | * Device side NFC Digital operations | |
96 | * | |
97 | * Initiator mode: | |
98 | * @in_configure_hw: Hardware configuration for RF technology and communication | |
99 | * framing in initiator mode. This is a synchronous function. | |
100 | * @in_send_cmd: Initiator mode data exchange using RF technology and framing | |
101 | * previously set with in_configure_hw. The peer response is returned | |
102 | * through callback cb. If an io error occurs or the peer didn't reply | |
103 | * within the specified timeout (ms), the error code is passed back through | |
104 | * the resp pointer. This is an asynchronous function. | |
105 | * | |
106 | * Target mode: Only NFC-DEP protocol is supported in target mode. | |
107 | * @tg_configure_hw: Hardware configuration for RF technology and communication | |
108 | * framing in target mode. This is a synchronous function. | |
109 | * @tg_send_cmd: Target mode data exchange using RF technology and framing | |
110 | * previously set with tg_configure_hw. The peer next command is returned | |
111 | * through callback cb. If an io error occurs or the peer didn't reply | |
112 | * within the specified timeout (ms), the error code is passed back through | |
113 | * the resp pointer. This is an asynchronous function. | |
114 | * @tg_listen: Put the device in listen mode waiting for data from the peer | |
115 | * device. This is an asynchronous function. | |
116 | * @tg_listen_mdaa: If supported, put the device in automatic listen mode with | |
117 | * mode detection and automatic anti-collision. In this mode, the device | |
118 | * automatically detects the RF technology and executes the anti-collision | |
119 | * detection using the command responses specified in mdaa_params. The | |
120 | * mdaa_params structure contains SENS_RES, NFCID1, and SEL_RES for 106A RF | |
121 | * tech. NFCID2 and system code (sc) for 212F and 424F. The driver returns | |
122 | * the NFC-DEP ATR_REQ command through cb. The digital stack deducts the RF | |
123 | * tech by analyzing the SoD of the frame containing the ATR_REQ command. | |
124 | * This is an asynchronous function. | |
125 | * | |
126 | * @switch_rf: Turns device radio on or off. The stack does not call explicitly | |
127 | * switch_rf to turn the radio on. A call to in|tg_configure_hw must turn | |
128 | * the device radio on. | |
129 | * @abort_cmd: Discard the last sent command. | |
444fb98e TE |
130 | * |
131 | * Notes: Asynchronous functions have a timeout parameter. It is the driver | |
132 | * responsibility to call the digital stack back through the | |
133 | * nfc_digital_cmd_complete_t callback when no RF respsonse has been | |
134 | * received within the specified time (in milliseconds). In that case the | |
135 | * driver must set the resp sk_buff to ERR_PTR(-ETIMEDOUT). | |
136 | * Since the digital stack serializes commands to be sent, it's mandatory | |
137 | * for the driver to handle the timeout correctly. Otherwise the stack | |
138 | * would not be able to send new commands, waiting for the reply of the | |
139 | * current one. | |
4b10884e TE |
140 | */ |
141 | struct nfc_digital_ops { | |
142 | int (*in_configure_hw)(struct nfc_digital_dev *ddev, int type, | |
143 | int param); | |
144 | int (*in_send_cmd)(struct nfc_digital_dev *ddev, struct sk_buff *skb, | |
145 | u16 timeout, nfc_digital_cmd_complete_t cb, | |
146 | void *arg); | |
147 | ||
148 | int (*tg_configure_hw)(struct nfc_digital_dev *ddev, int type, | |
149 | int param); | |
150 | int (*tg_send_cmd)(struct nfc_digital_dev *ddev, struct sk_buff *skb, | |
151 | u16 timeout, nfc_digital_cmd_complete_t cb, | |
152 | void *arg); | |
153 | int (*tg_listen)(struct nfc_digital_dev *ddev, u16 timeout, | |
154 | nfc_digital_cmd_complete_t cb, void *arg); | |
155 | int (*tg_listen_mdaa)(struct nfc_digital_dev *ddev, | |
156 | struct digital_tg_mdaa_params *mdaa_params, | |
157 | u16 timeout, nfc_digital_cmd_complete_t cb, | |
158 | void *arg); | |
159 | ||
160 | int (*switch_rf)(struct nfc_digital_dev *ddev, bool on); | |
161 | void (*abort_cmd)(struct nfc_digital_dev *ddev); | |
162 | }; | |
163 | ||
59ee2361 TE |
164 | #define NFC_DIGITAL_POLL_MODE_COUNT_MAX 6 /* 106A, 212F, and 424F in & tg */ |
165 | ||
166 | typedef int (*digital_poll_t)(struct nfc_digital_dev *ddev, u8 rf_tech); | |
167 | ||
168 | struct digital_poll_tech { | |
169 | u8 rf_tech; | |
170 | digital_poll_t poll_func; | |
171 | }; | |
172 | ||
4b10884e TE |
173 | /** |
174 | * Driver capabilities - bit mask made of the following values | |
175 | * | |
176 | * @NFC_DIGITAL_DRV_CAPS_IN_CRC: The driver handles CRC calculation in initiator | |
177 | * mode. | |
178 | * @NFC_DIGITAL_DRV_CAPS_TG_CRC: The driver handles CRC calculation in target | |
179 | * mode. | |
180 | */ | |
181 | #define NFC_DIGITAL_DRV_CAPS_IN_CRC 0x0001 | |
182 | #define NFC_DIGITAL_DRV_CAPS_TG_CRC 0x0002 | |
183 | ||
184 | struct nfc_digital_dev { | |
185 | struct nfc_dev *nfc_dev; | |
186 | struct nfc_digital_ops *ops; | |
187 | ||
188 | u32 protocols; | |
189 | ||
190 | int tx_headroom; | |
191 | int tx_tailroom; | |
192 | ||
193 | u32 driver_capabilities; | |
194 | void *driver_data; | |
59ee2361 TE |
195 | |
196 | struct digital_poll_tech poll_techs[NFC_DIGITAL_POLL_MODE_COUNT_MAX]; | |
197 | u8 poll_tech_count; | |
198 | u8 poll_tech_index; | |
199 | struct mutex poll_lock; | |
200 | ||
201 | struct work_struct cmd_work; | |
202 | struct work_struct cmd_complete_work; | |
203 | struct list_head cmd_queue; | |
204 | struct mutex cmd_lock; | |
205 | ||
206 | struct work_struct poll_work; | |
207 | ||
208 | u8 curr_protocol; | |
209 | u8 curr_rf_tech; | |
210 | u8 curr_nfc_dep_pni; | |
2c66daec | 211 | |
12e3d241 TE |
212 | u16 target_fsc; |
213 | ||
2c66daec TE |
214 | int (*skb_check_crc)(struct sk_buff *skb); |
215 | void (*skb_add_crc)(struct sk_buff *skb); | |
4b10884e TE |
216 | }; |
217 | ||
218 | struct nfc_digital_dev *nfc_digital_allocate_device(struct nfc_digital_ops *ops, | |
219 | __u32 supported_protocols, | |
220 | __u32 driver_capabilities, | |
221 | int tx_headroom, | |
222 | int tx_tailroom); | |
223 | void nfc_digital_free_device(struct nfc_digital_dev *ndev); | |
224 | int nfc_digital_register_device(struct nfc_digital_dev *ndev); | |
225 | void nfc_digital_unregister_device(struct nfc_digital_dev *ndev); | |
226 | ||
227 | static inline void nfc_digital_set_parent_dev(struct nfc_digital_dev *ndev, | |
228 | struct device *dev) | |
229 | { | |
230 | nfc_set_parent_dev(ndev->nfc_dev, dev); | |
231 | } | |
232 | ||
233 | static inline void nfc_digital_set_drvdata(struct nfc_digital_dev *dev, | |
234 | void *data) | |
235 | { | |
236 | dev->driver_data = data; | |
237 | } | |
238 | ||
239 | static inline void *nfc_digital_get_drvdata(struct nfc_digital_dev *dev) | |
240 | { | |
241 | return dev->driver_data; | |
242 | } | |
243 | ||
244 | #endif /* __NFC_DIGITAL_H */ |