Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
nci_core.h
Go to the documentation of this file.
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) 2011 Texas Instruments, Inc.
6  *
7  * Written by Ilan Elias <[email protected]>
8  *
9  * Acknowledgements:
10  * This file is based on hci_core.h, which was written
11  * by Maxim Krasnyansky.
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License version 2
15  * as published by the Free Software Foundation
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25  *
26  */
27 
28 #ifndef __NCI_CORE_H
29 #define __NCI_CORE_H
30 
31 #include <linux/interrupt.h>
32 #include <linux/skbuff.h>
33 
34 #include <net/nfc/nfc.h>
35 #include <net/nfc/nci.h>
36 
37 /* NCI device flags */
38 enum nci_flag {
43 };
44 
45 /* NCI device states */
46 enum nci_state {
52 };
53 
54 /* NCI timeouts */
55 #define NCI_RESET_TIMEOUT 5000
56 #define NCI_INIT_TIMEOUT 5000
57 #define NCI_SET_CONFIG_TIMEOUT 5000
58 #define NCI_RF_DISC_TIMEOUT 5000
59 #define NCI_RF_DISC_SELECT_TIMEOUT 5000
60 #define NCI_RF_DEACTIVATE_TIMEOUT 30000
61 #define NCI_CMD_TIMEOUT 5000
62 #define NCI_DATA_TIMEOUT 700
63 
64 struct nci_dev;
65 
66 struct nci_ops {
67  int (*open)(struct nci_dev *ndev);
68  int (*close)(struct nci_dev *ndev);
69  int (*send)(struct sk_buff *skb);
70 };
71 
72 #define NCI_MAX_SUPPORTED_RF_INTERFACES 4
73 #define NCI_MAX_DISCOVERED_TARGETS 10
74 
75 /* NCI Core structures */
76 struct nci_dev {
77  struct nfc_dev *nfc_dev;
78  struct nci_ops *ops;
79 
82 
84  unsigned long flags;
85 
88 
91 
94 
97 
100 
104 
105  struct mutex req_lock;
109 
110  void *driver_data;
111 
114 
117 
118  /* received during NCI_OP_CORE_RESET_RSP */
120 
121  /* received during NCI_OP_CORE_INIT_RSP */
132 
133  /* received during NCI_OP_RF_INTF_ACTIVATED_NTF */
136 
137  /* stored during nci_data_exchange */
141 
142  /* stored during intf_activated_ntf */
145 };
146 
147 /* ----- NCI Devices ----- */
148 struct nci_dev *nci_allocate_device(struct nci_ops *ops,
149  __u32 supported_protocols,
150  int tx_headroom,
151  int tx_tailroom);
152 void nci_free_device(struct nci_dev *ndev);
153 int nci_register_device(struct nci_dev *ndev);
154 void nci_unregister_device(struct nci_dev *ndev);
155 int nci_recv_frame(struct sk_buff *skb);
156 
157 static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev,
158  unsigned int len,
159  gfp_t how)
160 {
161  struct sk_buff *skb;
162 
163  skb = alloc_skb(len + ndev->tx_headroom + ndev->tx_tailroom, how);
164  if (skb)
165  skb_reserve(skb, ndev->tx_headroom);
166 
167  return skb;
168 }
169 
170 static inline void nci_set_parent_dev(struct nci_dev *ndev, struct device *dev)
171 {
172  nfc_set_parent_dev(ndev->nfc_dev, dev);
173 }
174 
175 static inline void nci_set_drvdata(struct nci_dev *ndev, void *data)
176 {
177  ndev->driver_data = data;
178 }
179 
180 static inline void *nci_get_drvdata(struct nci_dev *ndev)
181 {
182  return ndev->driver_data;
183 }
184 
185 void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb);
186 void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb);
187 void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb);
188 int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload);
189 int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb);
190 void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb,
191  int err);
192 void nci_clear_target_list(struct nci_dev *ndev);
193 
194 /* ----- NCI requests ----- */
195 #define NCI_REQ_DONE 0
196 #define NCI_REQ_PEND 1
197 #define NCI_REQ_CANCELED 2
198 
199 void nci_req_complete(struct nci_dev *ndev, int result);
200 
201 /* ----- NCI status code ----- */
202 int nci_to_errno(__u8 code);
203 
204 #endif /* __NCI_CORE_H */