diff options
Diffstat (limited to 'include/net/nfc/nci_core.h')
-rw-r--r-- | include/net/nfc/nci_core.h | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h new file mode 100644 index 000000000000..2563f3a95e67 --- /dev/null +++ b/include/net/nfc/nci_core.h | |||
@@ -0,0 +1,183 @@ | |||
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 <ilane@ti.com> | ||
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 state */ | ||
38 | enum { | ||
39 | NCI_INIT, | ||
40 | NCI_UP, | ||
41 | NCI_DISCOVERY, | ||
42 | NCI_POLL_ACTIVE, | ||
43 | }; | ||
44 | |||
45 | /* NCI timeouts */ | ||
46 | #define NCI_RESET_TIMEOUT 5000 | ||
47 | #define NCI_INIT_TIMEOUT 5000 | ||
48 | #define NCI_RF_DISC_TIMEOUT 5000 | ||
49 | #define NCI_RF_DEACTIVATE_TIMEOUT 5000 | ||
50 | #define NCI_CMD_TIMEOUT 5000 | ||
51 | |||
52 | struct nci_dev; | ||
53 | |||
54 | struct nci_ops { | ||
55 | int (*open)(struct nci_dev *ndev); | ||
56 | int (*close)(struct nci_dev *ndev); | ||
57 | int (*send)(struct sk_buff *skb); | ||
58 | }; | ||
59 | |||
60 | #define NCI_MAX_SUPPORTED_RF_INTERFACES 4 | ||
61 | |||
62 | /* NCI Core structures */ | ||
63 | struct nci_dev { | ||
64 | struct nfc_dev *nfc_dev; | ||
65 | struct nci_ops *ops; | ||
66 | |||
67 | int tx_headroom; | ||
68 | int tx_tailroom; | ||
69 | |||
70 | unsigned long flags; | ||
71 | |||
72 | atomic_t cmd_cnt; | ||
73 | atomic_t credits_cnt; | ||
74 | |||
75 | struct timer_list cmd_timer; | ||
76 | |||
77 | struct workqueue_struct *cmd_wq; | ||
78 | struct work_struct cmd_work; | ||
79 | |||
80 | struct workqueue_struct *rx_wq; | ||
81 | struct work_struct rx_work; | ||
82 | |||
83 | struct workqueue_struct *tx_wq; | ||
84 | struct work_struct tx_work; | ||
85 | |||
86 | struct sk_buff_head cmd_q; | ||
87 | struct sk_buff_head rx_q; | ||
88 | struct sk_buff_head tx_q; | ||
89 | |||
90 | struct mutex req_lock; | ||
91 | struct completion req_completion; | ||
92 | __u32 req_status; | ||
93 | __u32 req_result; | ||
94 | |||
95 | void *driver_data; | ||
96 | |||
97 | __u32 poll_prots; | ||
98 | __u32 target_available_prots; | ||
99 | __u32 target_active_prot; | ||
100 | |||
101 | /* received during NCI_OP_CORE_RESET_RSP */ | ||
102 | __u8 nci_ver; | ||
103 | |||
104 | /* received during NCI_OP_CORE_INIT_RSP */ | ||
105 | __u32 nfcc_features; | ||
106 | __u8 num_supported_rf_interfaces; | ||
107 | __u8 supported_rf_interfaces | ||
108 | [NCI_MAX_SUPPORTED_RF_INTERFACES]; | ||
109 | __u8 max_logical_connections; | ||
110 | __u16 max_routing_table_size; | ||
111 | __u8 max_control_packet_payload_length; | ||
112 | __u16 rf_sending_buffer_size; | ||
113 | __u16 rf_receiving_buffer_size; | ||
114 | __u16 manufacturer_id; | ||
115 | |||
116 | /* received during NCI_OP_CORE_CONN_CREATE_RSP for static conn 0 */ | ||
117 | __u8 max_pkt_payload_size; | ||
118 | __u8 initial_num_credits; | ||
119 | __u8 conn_id; | ||
120 | |||
121 | /* stored during nci_data_exchange */ | ||
122 | data_exchange_cb_t data_exchange_cb; | ||
123 | void *data_exchange_cb_context; | ||
124 | struct sk_buff *rx_data_reassembly; | ||
125 | }; | ||
126 | |||
127 | /* ----- NCI Devices ----- */ | ||
128 | struct nci_dev *nci_allocate_device(struct nci_ops *ops, | ||
129 | __u32 supported_protocols, | ||
130 | int tx_headroom, | ||
131 | int tx_tailroom); | ||
132 | void nci_free_device(struct nci_dev *ndev); | ||
133 | int nci_register_device(struct nci_dev *ndev); | ||
134 | void nci_unregister_device(struct nci_dev *ndev); | ||
135 | int nci_recv_frame(struct sk_buff *skb); | ||
136 | |||
137 | static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev, | ||
138 | unsigned int len, | ||
139 | gfp_t how) | ||
140 | { | ||
141 | struct sk_buff *skb; | ||
142 | |||
143 | skb = alloc_skb(len + ndev->tx_headroom + ndev->tx_tailroom, how); | ||
144 | if (skb) | ||
145 | skb_reserve(skb, ndev->tx_headroom); | ||
146 | |||
147 | return skb; | ||
148 | } | ||
149 | |||
150 | static inline void nci_set_parent_dev(struct nci_dev *ndev, struct device *dev) | ||
151 | { | ||
152 | nfc_set_parent_dev(ndev->nfc_dev, dev); | ||
153 | } | ||
154 | |||
155 | static inline void nci_set_drvdata(struct nci_dev *ndev, void *data) | ||
156 | { | ||
157 | ndev->driver_data = data; | ||
158 | } | ||
159 | |||
160 | static inline void *nci_get_drvdata(struct nci_dev *ndev) | ||
161 | { | ||
162 | return ndev->driver_data; | ||
163 | } | ||
164 | |||
165 | void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb); | ||
166 | void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb); | ||
167 | void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb); | ||
168 | int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload); | ||
169 | int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb); | ||
170 | void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb, | ||
171 | int err); | ||
172 | |||
173 | /* ----- NCI requests ----- */ | ||
174 | #define NCI_REQ_DONE 0 | ||
175 | #define NCI_REQ_PEND 1 | ||
176 | #define NCI_REQ_CANCELED 2 | ||
177 | |||
178 | void nci_req_complete(struct nci_dev *ndev, int result); | ||
179 | |||
180 | /* ----- NCI status code ----- */ | ||
181 | int nci_to_errno(__u8 code); | ||
182 | |||
183 | #endif /* __NCI_CORE_H */ | ||