xref: /openbmc/linux/include/net/nfc/nci.h (revision ca55b2fe)
1 /*
2  *  The NFC Controller Interface is the communication protocol between an
3  *  NFC Controller (NFCC) and a Device Host (DH).
4  *
5  *  Copyright (C) 2014 Marvell International Ltd.
6  *  Copyright (C) 2011 Texas Instruments, Inc.
7  *
8  *  Written by Ilan Elias <ilane@ti.com>
9  *
10  *  Acknowledgements:
11  *  This file is based on hci.h, which was written
12  *  by Maxim Krasnyansky.
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 version 2
16  *  as published by the Free Software Foundation
17  *
18  *  This program is distributed in the hope that it will be useful,
19  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  *  GNU General Public License for more details.
22  *
23  *  You should have received a copy of the GNU General Public License
24  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
25  *
26  */
27 
28 #ifndef __NCI_H
29 #define __NCI_H
30 
31 #include <net/nfc/nfc.h>
32 
33 /* NCI constants */
34 #define NCI_MAX_NUM_MAPPING_CONFIGS				10
35 #define NCI_MAX_NUM_RF_CONFIGS					10
36 #define NCI_MAX_NUM_CONN					10
37 #define NCI_MAX_PARAM_LEN					251
38 #define NCI_MAX_PACKET_SIZE					258
39 
40 /* NCI Status Codes */
41 #define NCI_STATUS_OK						0x00
42 #define NCI_STATUS_REJECTED					0x01
43 #define NCI_STATUS_RF_FRAME_CORRUPTED				0x02
44 #define NCI_STATUS_FAILED					0x03
45 #define NCI_STATUS_NOT_INITIALIZED				0x04
46 #define NCI_STATUS_SYNTAX_ERROR					0x05
47 #define NCI_STATUS_SEMANTIC_ERROR				0x06
48 #define NCI_STATUS_UNKNOWN_GID					0x07
49 #define NCI_STATUS_UNKNOWN_OID					0x08
50 #define NCI_STATUS_INVALID_PARAM				0x09
51 #define NCI_STATUS_MESSAGE_SIZE_EXCEEDED			0x0a
52 /* Discovery Specific Status Codes */
53 #define NCI_STATUS_DISCOVERY_ALREADY_STARTED			0xa0
54 #define NCI_STATUS_DISCOVERY_TARGET_ACTIVATION_FAILED		0xa1
55 #define NCI_STATUS_DISCOVERY_TEAR_DOWN				0xa2
56 /* RF Interface Specific Status Codes */
57 #define NCI_STATUS_RF_TRANSMISSION_ERROR			0xb0
58 #define NCI_STATUS_RF_PROTOCOL_ERROR				0xb1
59 #define NCI_STATUS_RF_TIMEOUT_ERROR				0xb2
60 /* NFCEE Interface Specific Status Codes */
61 #define NCI_STATUS_NFCEE_INTERFACE_ACTIVATION_FAILED		0xc0
62 #define NCI_STATUS_NFCEE_TRANSMISSION_ERROR			0xc1
63 #define NCI_STATUS_NFCEE_PROTOCOL_ERROR				0xc2
64 #define NCI_STATUS_NFCEE_TIMEOUT_ERROR				0xc3
65 
66 /* NFCEE Interface/Protocols */
67 #define NCI_NFCEE_INTERFACE_APDU           0x00
68 #define NCI_NFCEE_INTERFACE_HCI_ACCESS     0x01
69 #define NCI_NFCEE_INTERFACE_TYPE3_CMD_SET  0x02
70 #define NCI_NFCEE_INTERFACE_TRANSPARENT        0x03
71 
72 /* Destination type */
73 #define NCI_DESTINATION_NFCC_LOOPBACK      0x01
74 #define NCI_DESTINATION_REMOTE_NFC_ENDPOINT    0x02
75 #define NCI_DESTINATION_NFCEE              0x03
76 
77 /* Destination-specific parameters type */
78 #define NCI_DESTINATION_SPECIFIC_PARAM_RF_TYPE     0x00
79 #define NCI_DESTINATION_SPECIFIC_PARAM_NFCEE_TYPE  0x01
80 
81 /* NFCEE Discovery Action */
82 #define NCI_NFCEE_DISCOVERY_ACTION_DISABLE			0x00
83 #define NCI_NFCEE_DISCOVERY_ACTION_ENABLE			0x01
84 
85 /* NCI RF Technology and Mode */
86 #define NCI_NFC_A_PASSIVE_POLL_MODE				0x00
87 #define NCI_NFC_B_PASSIVE_POLL_MODE				0x01
88 #define NCI_NFC_F_PASSIVE_POLL_MODE				0x02
89 #define NCI_NFC_A_ACTIVE_POLL_MODE				0x03
90 #define NCI_NFC_F_ACTIVE_POLL_MODE				0x05
91 #define NCI_NFC_V_PASSIVE_POLL_MODE				0x06
92 #define NCI_NFC_A_PASSIVE_LISTEN_MODE				0x80
93 #define NCI_NFC_B_PASSIVE_LISTEN_MODE				0x81
94 #define NCI_NFC_F_PASSIVE_LISTEN_MODE				0x82
95 #define NCI_NFC_A_ACTIVE_LISTEN_MODE				0x83
96 #define NCI_NFC_F_ACTIVE_LISTEN_MODE				0x85
97 
98 #define NCI_RF_TECH_MODE_LISTEN_MASK				0x80
99 
100 /* NCI RF Technologies */
101 #define NCI_NFC_RF_TECHNOLOGY_A					0x00
102 #define NCI_NFC_RF_TECHNOLOGY_B					0x01
103 #define NCI_NFC_RF_TECHNOLOGY_F					0x02
104 #define NCI_NFC_RF_TECHNOLOGY_V					0x03
105 
106 /* NCI Bit Rates */
107 #define NCI_NFC_BIT_RATE_106					0x00
108 #define NCI_NFC_BIT_RATE_212					0x01
109 #define NCI_NFC_BIT_RATE_424					0x02
110 #define NCI_NFC_BIT_RATE_848					0x03
111 #define NCI_NFC_BIT_RATE_1695					0x04
112 #define NCI_NFC_BIT_RATE_3390					0x05
113 #define NCI_NFC_BIT_RATE_6780					0x06
114 #define NCI_NFC_BIT_RATE_26					0x20
115 
116 /* NCI RF Protocols */
117 #define NCI_RF_PROTOCOL_UNKNOWN					0x00
118 #define NCI_RF_PROTOCOL_T1T					0x01
119 #define NCI_RF_PROTOCOL_T2T					0x02
120 #define NCI_RF_PROTOCOL_T3T					0x03
121 #define NCI_RF_PROTOCOL_ISO_DEP					0x04
122 #define NCI_RF_PROTOCOL_NFC_DEP					0x05
123 #define NCI_RF_PROTOCOL_T5T					0x06
124 
125 /* NCI RF Interfaces */
126 #define NCI_RF_INTERFACE_NFCEE_DIRECT				0x00
127 #define NCI_RF_INTERFACE_FRAME					0x01
128 #define NCI_RF_INTERFACE_ISO_DEP				0x02
129 #define NCI_RF_INTERFACE_NFC_DEP				0x03
130 
131 /* NCI Configuration Parameter Tags */
132 #define NCI_PN_ATR_REQ_GEN_BYTES				0x29
133 #define NCI_LN_ATR_RES_GEN_BYTES				0x61
134 #define NCI_LA_SEL_INFO						0x32
135 #define NCI_LF_PROTOCOL_TYPE					0x50
136 #define NCI_LF_CON_BITR_F					0x54
137 
138 /* NCI Configuration Parameters masks */
139 #define NCI_LA_SEL_INFO_ISO_DEP_MASK				0x20
140 #define NCI_LA_SEL_INFO_NFC_DEP_MASK				0x40
141 #define NCI_LF_PROTOCOL_TYPE_NFC_DEP_MASK			0x02
142 #define NCI_LF_CON_BITR_F_212					0x02
143 #define NCI_LF_CON_BITR_F_424					0x04
144 
145 /* NCI Reset types */
146 #define NCI_RESET_TYPE_KEEP_CONFIG				0x00
147 #define NCI_RESET_TYPE_RESET_CONFIG				0x01
148 
149 /* NCI Static RF connection ID */
150 #define NCI_STATIC_RF_CONN_ID					0x00
151 
152 /* NCI Data Flow Control */
153 #define NCI_DATA_FLOW_CONTROL_NOT_USED				0xff
154 
155 /* NCI RF_DISCOVER_MAP_CMD modes */
156 #define NCI_DISC_MAP_MODE_POLL					0x01
157 #define NCI_DISC_MAP_MODE_LISTEN				0x02
158 
159 /* NCI Discover Notification Type */
160 #define NCI_DISCOVER_NTF_TYPE_LAST				0x00
161 #define NCI_DISCOVER_NTF_TYPE_LAST_NFCC				0x01
162 #define NCI_DISCOVER_NTF_TYPE_MORE				0x02
163 
164 /* NCI Deactivation Type */
165 #define NCI_DEACTIVATE_TYPE_IDLE_MODE				0x00
166 #define NCI_DEACTIVATE_TYPE_SLEEP_MODE				0x01
167 #define NCI_DEACTIVATE_TYPE_SLEEP_AF_MODE			0x02
168 #define NCI_DEACTIVATE_TYPE_DISCOVERY				0x03
169 
170 /* Message Type (MT) */
171 #define NCI_MT_DATA_PKT						0x00
172 #define NCI_MT_CMD_PKT						0x01
173 #define NCI_MT_RSP_PKT						0x02
174 #define NCI_MT_NTF_PKT						0x03
175 
176 #define nci_mt(hdr)			(((hdr)[0]>>5)&0x07)
177 #define nci_mt_set(hdr, mt)		((hdr)[0] |= (__u8)(((mt)&0x07)<<5))
178 
179 /* Packet Boundary Flag (PBF) */
180 #define NCI_PBF_LAST						0x00
181 #define NCI_PBF_CONT						0x01
182 
183 #define nci_pbf(hdr)			(__u8)(((hdr)[0]>>4)&0x01)
184 #define nci_pbf_set(hdr, pbf)		((hdr)[0] |= (__u8)(((pbf)&0x01)<<4))
185 
186 /* Control Opcode manipulation */
187 #define nci_opcode_pack(gid, oid)	(__u16)((((__u16)((gid)&0x0f))<<8)|\
188 					((__u16)((oid)&0x3f)))
189 #define nci_opcode(hdr)			nci_opcode_pack(hdr[0], hdr[1])
190 #define nci_opcode_gid(op)		(__u8)(((op)&0x0f00)>>8)
191 #define nci_opcode_oid(op)		(__u8)((op)&0x003f)
192 
193 /* Payload Length */
194 #define nci_plen(hdr)			(__u8)((hdr)[2])
195 
196 /* Connection ID */
197 #define nci_conn_id(hdr)		(__u8)(((hdr)[0])&0x0f)
198 
199 /* GID values */
200 #define NCI_GID_CORE						0x0
201 #define NCI_GID_RF_MGMT						0x1
202 #define NCI_GID_NFCEE_MGMT					0x2
203 #define NCI_GID_PROPRIETARY					0xf
204 
205 /* ----- NCI over SPI head/crc(tail) room needed for outgoing frames ----- */
206 #define NCI_SPI_HDR_LEN						4
207 #define NCI_SPI_CRC_LEN						2
208 
209 /* ---- NCI Packet structures ---- */
210 #define NCI_CTRL_HDR_SIZE					3
211 #define NCI_DATA_HDR_SIZE					3
212 
213 struct nci_ctrl_hdr {
214 	__u8	gid;		/* MT & PBF & GID */
215 	__u8	oid;
216 	__u8	plen;
217 } __packed;
218 
219 struct nci_data_hdr {
220 	__u8	conn_id;	/* MT & PBF & ConnID */
221 	__u8	rfu;
222 	__u8	plen;
223 } __packed;
224 
225 /* ------------------------ */
226 /* -----  NCI Commands ---- */
227 /* ------------------------ */
228 #define NCI_OP_CORE_RESET_CMD		nci_opcode_pack(NCI_GID_CORE, 0x00)
229 struct nci_core_reset_cmd {
230 	__u8	reset_type;
231 } __packed;
232 
233 #define NCI_OP_CORE_INIT_CMD		nci_opcode_pack(NCI_GID_CORE, 0x01)
234 
235 #define NCI_OP_CORE_SET_CONFIG_CMD	nci_opcode_pack(NCI_GID_CORE, 0x02)
236 struct set_config_param {
237 	__u8	id;
238 	__u8	len;
239 	__u8	val[NCI_MAX_PARAM_LEN];
240 } __packed;
241 
242 struct nci_core_set_config_cmd {
243 	__u8	num_params;
244 	struct	set_config_param param; /* support 1 param per cmd is enough */
245 } __packed;
246 
247 #define NCI_OP_CORE_CONN_CREATE_CMD	nci_opcode_pack(NCI_GID_CORE, 0x04)
248 #define DEST_SPEC_PARAMS_ID_INDEX	0
249 #define DEST_SPEC_PARAMS_PROTOCOL_INDEX	1
250 struct dest_spec_params {
251 	__u8    id;
252 	__u8    protocol;
253 } __packed;
254 
255 struct core_conn_create_dest_spec_params {
256 	__u8    type;
257 	__u8    length;
258 	__u8    value[0];
259 } __packed;
260 
261 struct nci_core_conn_create_cmd {
262 	__u8    destination_type;
263 	__u8    number_destination_params;
264 	struct core_conn_create_dest_spec_params params[0];
265 } __packed;
266 
267 #define NCI_OP_CORE_CONN_CLOSE_CMD	nci_opcode_pack(NCI_GID_CORE, 0x05)
268 
269 #define NCI_OP_RF_DISCOVER_MAP_CMD	nci_opcode_pack(NCI_GID_RF_MGMT, 0x00)
270 struct disc_map_config {
271 	__u8	rf_protocol;
272 	__u8	mode;
273 	__u8	rf_interface;
274 } __packed;
275 
276 struct nci_rf_disc_map_cmd {
277 	__u8				num_mapping_configs;
278 	struct disc_map_config		mapping_configs
279 					[NCI_MAX_NUM_MAPPING_CONFIGS];
280 } __packed;
281 
282 #define NCI_OP_RF_DISCOVER_CMD		nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
283 struct disc_config {
284 	__u8	rf_tech_and_mode;
285 	__u8	frequency;
286 } __packed;
287 
288 struct nci_rf_disc_cmd {
289 	__u8				num_disc_configs;
290 	struct disc_config		disc_configs[NCI_MAX_NUM_RF_CONFIGS];
291 } __packed;
292 
293 #define NCI_OP_RF_DISCOVER_SELECT_CMD	nci_opcode_pack(NCI_GID_RF_MGMT, 0x04)
294 struct nci_rf_discover_select_cmd {
295 	__u8	rf_discovery_id;
296 	__u8	rf_protocol;
297 	__u8	rf_interface;
298 } __packed;
299 
300 #define NCI_OP_RF_DEACTIVATE_CMD	nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)
301 struct nci_rf_deactivate_cmd {
302 	__u8	type;
303 } __packed;
304 
305 #define NCI_OP_NFCEE_DISCOVER_CMD nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00)
306 struct nci_nfcee_discover_cmd {
307 	__u8	discovery_action;
308 } __packed;
309 
310 #define NCI_OP_NFCEE_MODE_SET_CMD nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x01)
311 #define NCI_NFCEE_DISABLE	0x00
312 #define NCI_NFCEE_ENABLE	0x01
313 struct nci_nfcee_mode_set_cmd {
314 	__u8	nfcee_id;
315 	__u8	nfcee_mode;
316 } __packed;
317 
318 /* ----------------------- */
319 /* ---- NCI Responses ---- */
320 /* ----------------------- */
321 #define NCI_OP_CORE_RESET_RSP		nci_opcode_pack(NCI_GID_CORE, 0x00)
322 struct nci_core_reset_rsp {
323 	__u8	status;
324 	__u8	nci_ver;
325 	__u8	config_status;
326 } __packed;
327 
328 #define NCI_OP_CORE_INIT_RSP		nci_opcode_pack(NCI_GID_CORE, 0x01)
329 struct nci_core_init_rsp_1 {
330 	__u8	status;
331 	__le32	nfcc_features;
332 	__u8	num_supported_rf_interfaces;
333 	__u8	supported_rf_interfaces[0];	/* variable size array */
334 	/* continuted in nci_core_init_rsp_2 */
335 } __packed;
336 
337 struct nci_core_init_rsp_2 {
338 	__u8	max_logical_connections;
339 	__le16	max_routing_table_size;
340 	__u8	max_ctrl_pkt_payload_len;
341 	__le16	max_size_for_large_params;
342 	__u8	manufact_id;
343 	__le32	manufact_specific_info;
344 } __packed;
345 
346 #define NCI_OP_CORE_SET_CONFIG_RSP	nci_opcode_pack(NCI_GID_CORE, 0x02)
347 struct nci_core_set_config_rsp {
348 	__u8	status;
349 	__u8	num_params;
350 	__u8	params_id[0];	/* variable size array */
351 } __packed;
352 
353 #define NCI_OP_CORE_CONN_CREATE_RSP	nci_opcode_pack(NCI_GID_CORE, 0x04)
354 struct nci_core_conn_create_rsp {
355 	__u8	status;
356 	__u8	max_ctrl_pkt_payload_len;
357 	__u8    credits_cnt;
358 	__u8	conn_id;
359 } __packed;
360 
361 #define NCI_OP_CORE_CONN_CLOSE_RSP	nci_opcode_pack(NCI_GID_CORE, 0x05)
362 
363 #define NCI_OP_RF_DISCOVER_MAP_RSP	nci_opcode_pack(NCI_GID_RF_MGMT, 0x00)
364 
365 #define NCI_OP_RF_DISCOVER_RSP		nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
366 
367 #define NCI_OP_RF_DISCOVER_SELECT_RSP	nci_opcode_pack(NCI_GID_RF_MGMT, 0x04)
368 
369 #define NCI_OP_RF_DEACTIVATE_RSP	nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)
370 
371 #define NCI_OP_NFCEE_DISCOVER_RSP nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00)
372 struct nci_nfcee_discover_rsp {
373 	__u8	status;
374 	__u8	num_nfcee;
375 } __packed;
376 
377 #define NCI_OP_NFCEE_MODE_SET_RSP nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x01)
378 /* --------------------------- */
379 /* ---- NCI Notifications ---- */
380 /* --------------------------- */
381 #define NCI_OP_CORE_CONN_CREDITS_NTF	nci_opcode_pack(NCI_GID_CORE, 0x06)
382 struct conn_credit_entry {
383 	__u8	conn_id;
384 	__u8	credits;
385 } __packed;
386 
387 struct nci_core_conn_credit_ntf {
388 	__u8				num_entries;
389 	struct conn_credit_entry	conn_entries[NCI_MAX_NUM_CONN];
390 } __packed;
391 
392 #define NCI_OP_CORE_GENERIC_ERROR_NTF	nci_opcode_pack(NCI_GID_CORE, 0x07)
393 
394 #define NCI_OP_CORE_INTF_ERROR_NTF	nci_opcode_pack(NCI_GID_CORE, 0x08)
395 struct nci_core_intf_error_ntf {
396 	__u8	status;
397 	__u8	conn_id;
398 } __packed;
399 
400 #define NCI_OP_RF_DISCOVER_NTF		nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
401 struct rf_tech_specific_params_nfca_poll {
402 	__u16	sens_res;
403 	__u8	nfcid1_len;	/* 0, 4, 7, or 10 Bytes */
404 	__u8	nfcid1[NFC_NFCID1_MAXSIZE];
405 	__u8	sel_res_len;	/* 0 or 1 Bytes */
406 	__u8	sel_res;
407 } __packed;
408 
409 struct rf_tech_specific_params_nfcb_poll {
410 	__u8	sensb_res_len;
411 	__u8	sensb_res[NFC_SENSB_RES_MAXSIZE];	/* 11 or 12 Bytes */
412 } __packed;
413 
414 struct rf_tech_specific_params_nfcf_poll {
415 	__u8	bit_rate;
416 	__u8	sensf_res_len;
417 	__u8	sensf_res[NFC_SENSF_RES_MAXSIZE];	/* 16 or 18 Bytes */
418 } __packed;
419 
420 struct rf_tech_specific_params_nfcv_poll {
421 	__u8	res_flags;
422 	__u8	dsfid;
423 	__u8	uid[NFC_ISO15693_UID_MAXSIZE];	/* 8 Bytes */
424 } __packed;
425 
426 struct rf_tech_specific_params_nfcf_listen {
427 	__u8	local_nfcid2_len;
428 	__u8	local_nfcid2[NFC_NFCID2_MAXSIZE];	/* 0 or 8 Bytes */
429 } __packed;
430 
431 struct nci_rf_discover_ntf {
432 	__u8	rf_discovery_id;
433 	__u8	rf_protocol;
434 	__u8	rf_tech_and_mode;
435 	__u8	rf_tech_specific_params_len;
436 
437 	union {
438 		struct rf_tech_specific_params_nfca_poll nfca_poll;
439 		struct rf_tech_specific_params_nfcb_poll nfcb_poll;
440 		struct rf_tech_specific_params_nfcf_poll nfcf_poll;
441 		struct rf_tech_specific_params_nfcv_poll nfcv_poll;
442 	} rf_tech_specific_params;
443 
444 	__u8	ntf_type;
445 } __packed;
446 
447 #define NCI_OP_RF_INTF_ACTIVATED_NTF	nci_opcode_pack(NCI_GID_RF_MGMT, 0x05)
448 struct activation_params_nfca_poll_iso_dep {
449 	__u8	rats_res_len;
450 	__u8	rats_res[20];
451 };
452 
453 struct activation_params_nfcb_poll_iso_dep {
454 	__u8	attrib_res_len;
455 	__u8	attrib_res[50];
456 };
457 
458 struct activation_params_poll_nfc_dep {
459 	__u8	atr_res_len;
460 	__u8	atr_res[NFC_ATR_RES_MAXSIZE - 2]; /* ATR_RES from byte 3 */
461 };
462 
463 struct activation_params_listen_nfc_dep {
464 	__u8	atr_req_len;
465 	__u8	atr_req[NFC_ATR_REQ_MAXSIZE - 2]; /* ATR_REQ from byte 3 */
466 };
467 
468 struct nci_rf_intf_activated_ntf {
469 	__u8	rf_discovery_id;
470 	__u8	rf_interface;
471 	__u8	rf_protocol;
472 	__u8	activation_rf_tech_and_mode;
473 	__u8	max_data_pkt_payload_size;
474 	__u8	initial_num_credits;
475 	__u8	rf_tech_specific_params_len;
476 
477 	union {
478 		struct rf_tech_specific_params_nfca_poll nfca_poll;
479 		struct rf_tech_specific_params_nfcb_poll nfcb_poll;
480 		struct rf_tech_specific_params_nfcf_poll nfcf_poll;
481 		struct rf_tech_specific_params_nfcv_poll nfcv_poll;
482 		struct rf_tech_specific_params_nfcf_listen nfcf_listen;
483 	} rf_tech_specific_params;
484 
485 	__u8	data_exch_rf_tech_and_mode;
486 	__u8	data_exch_tx_bit_rate;
487 	__u8	data_exch_rx_bit_rate;
488 	__u8	activation_params_len;
489 
490 	union {
491 		struct activation_params_nfca_poll_iso_dep nfca_poll_iso_dep;
492 		struct activation_params_nfcb_poll_iso_dep nfcb_poll_iso_dep;
493 		struct activation_params_poll_nfc_dep poll_nfc_dep;
494 		struct activation_params_listen_nfc_dep listen_nfc_dep;
495 	} activation_params;
496 
497 } __packed;
498 
499 #define NCI_OP_RF_DEACTIVATE_NTF	nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)
500 struct nci_rf_deactivate_ntf {
501 	__u8	type;
502 	__u8	reason;
503 } __packed;
504 
505 #define NCI_OP_RF_NFCEE_ACTION_NTF	nci_opcode_pack(NCI_GID_RF_MGMT, 0x09)
506 struct nci_rf_nfcee_action_ntf {
507 	__u8 nfcee_id;
508 	__u8 trigger;
509 	__u8 supported_data_length;
510 	__u8 supported_data[0];
511 } __packed;
512 
513 #define NCI_OP_NFCEE_DISCOVER_NTF nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00)
514 struct nci_nfcee_supported_protocol {
515 	__u8	num_protocol;
516 	__u8	supported_protocol[0];
517 } __packed;
518 
519 struct nci_nfcee_information_tlv {
520 	__u8	num_tlv;
521 	__u8	information_tlv[0];
522 } __packed;
523 
524 struct nci_nfcee_discover_ntf {
525 	__u8	nfcee_id;
526 	__u8	nfcee_status;
527 	struct nci_nfcee_supported_protocol supported_protocols;
528 	struct nci_nfcee_information_tlv	information_tlv;
529 } __packed;
530 
531 #endif /* __NCI_H */
532