]>
Commit | Line | Data |
---|---|---|
caab277b | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
6a2968aa IE |
2 | /* |
3 | * The NFC Controller Interface is the communication protocol between an | |
4 | * NFC Controller (NFCC) and a Device Host (DH). | |
5 | * | |
6 | * Copyright (C) 2011 Texas Instruments, Inc. | |
8a00a61b | 7 | * Copyright (C) 2013 Intel Corporation. All rights reserved. |
a99903ec | 8 | * Copyright (C) 2014 Marvell International Ltd. |
6a2968aa IE |
9 | * |
10 | * Written by Ilan Elias <ilane@ti.com> | |
11 | * | |
12 | * Acknowledgements: | |
13 | * This file is based on hci_core.h, which was written | |
14 | * by Maxim Krasnyansky. | |
6a2968aa IE |
15 | */ |
16 | ||
17 | #ifndef __NCI_CORE_H | |
18 | #define __NCI_CORE_H | |
19 | ||
20 | #include <linux/interrupt.h> | |
21 | #include <linux/skbuff.h> | |
9961127d | 22 | #include <linux/tty.h> |
6a2968aa IE |
23 | |
24 | #include <net/nfc/nfc.h> | |
25 | #include <net/nfc/nci.h> | |
26 | ||
8939e47f IE |
27 | /* NCI device flags */ |
28 | enum nci_flag { | |
6a2968aa IE |
29 | NCI_INIT, |
30 | NCI_UP, | |
38f04c6b | 31 | NCI_DATA_EXCHANGE, |
c4bf98b2 | 32 | NCI_DATA_EXCHANGE_TO, |
6a2968aa IE |
33 | }; |
34 | ||
8939e47f IE |
35 | /* NCI device states */ |
36 | enum nci_state { | |
37 | NCI_IDLE, | |
38 | NCI_DISCOVERY, | |
019c4fba IE |
39 | NCI_W4_ALL_DISCOVERIES, |
40 | NCI_W4_HOST_SELECT, | |
8939e47f | 41 | NCI_POLL_ACTIVE, |
a99903ec JL |
42 | NCI_LISTEN_ACTIVE, |
43 | NCI_LISTEN_SLEEP, | |
8939e47f IE |
44 | }; |
45 | ||
6a2968aa IE |
46 | /* NCI timeouts */ |
47 | #define NCI_RESET_TIMEOUT 5000 | |
48 | #define NCI_INIT_TIMEOUT 5000 | |
7e035230 | 49 | #define NCI_SET_CONFIG_TIMEOUT 5000 |
6a2968aa | 50 | #define NCI_RF_DISC_TIMEOUT 5000 |
019c4fba | 51 | #define NCI_RF_DISC_SELECT_TIMEOUT 5000 |
11ee5158 | 52 | #define NCI_RF_DEACTIVATE_TIMEOUT 30000 |
6a2968aa | 53 | #define NCI_CMD_TIMEOUT 5000 |
c4bf98b2 | 54 | #define NCI_DATA_TIMEOUT 700 |
6a2968aa IE |
55 | |
56 | struct nci_dev; | |
57 | ||
22e4bd09 | 58 | struct nci_driver_ops { |
b6355e97 SO |
59 | __u16 opcode; |
60 | int (*rsp)(struct nci_dev *dev, struct sk_buff *skb); | |
61 | int (*ntf)(struct nci_dev *dev, struct sk_buff *skb); | |
62 | }; | |
63 | ||
6a2968aa | 64 | struct nci_ops { |
c39daeee | 65 | int (*init)(struct nci_dev *ndev); |
9e87f9a9 CR |
66 | int (*open)(struct nci_dev *ndev); |
67 | int (*close)(struct nci_dev *ndev); | |
68 | int (*send)(struct nci_dev *ndev, struct sk_buff *skb); | |
69 | int (*setup)(struct nci_dev *ndev); | |
fdf79bd4 | 70 | int (*post_setup)(struct nci_dev *ndev); |
25af01ed | 71 | int (*fw_download)(struct nci_dev *ndev, const char *firmware_name); |
9e87f9a9 | 72 | __u32 (*get_rfprotocol)(struct nci_dev *ndev, __u8 rf_protocol); |
ba4db551 | 73 | int (*discover_se)(struct nci_dev *ndev); |
e9ef9431 | 74 | int (*disable_se)(struct nci_dev *ndev, u32 se_idx); |
93bca2bf | 75 | int (*enable_se)(struct nci_dev *ndev, u32 se_idx); |
a688bf55 CR |
76 | int (*se_io)(struct nci_dev *ndev, u32 se_idx, |
77 | u8 *apdu, size_t apdu_length, | |
78 | se_io_cb_t cb, void *cb_context); | |
11f54f22 CR |
79 | int (*hci_load_session)(struct nci_dev *ndev); |
80 | void (*hci_event_received)(struct nci_dev *ndev, u8 pipe, u8 event, | |
81 | struct sk_buff *skb); | |
82 | void (*hci_cmd_received)(struct nci_dev *ndev, u8 pipe, u8 cmd, | |
83 | struct sk_buff *skb); | |
b6355e97 | 84 | |
22e4bd09 | 85 | struct nci_driver_ops *prop_ops; |
b6355e97 | 86 | size_t n_prop_ops; |
0a97a3cb | 87 | |
22e4bd09 | 88 | struct nci_driver_ops *core_ops; |
0a97a3cb | 89 | size_t n_core_ops; |
6a2968aa IE |
90 | }; |
91 | ||
92 | #define NCI_MAX_SUPPORTED_RF_INTERFACES 4 | |
019c4fba | 93 | #define NCI_MAX_DISCOVERED_TARGETS 10 |
4aeee687 CR |
94 | #define NCI_MAX_NUM_NFCEE 255 |
95 | #define NCI_MAX_CONN_ID 7 | |
b6355e97 | 96 | #define NCI_MAX_PROPRIETARY_CMD 64 |
4aeee687 CR |
97 | |
98 | struct nci_conn_info { | |
99 | struct list_head list; | |
9b8d1a4c CR |
100 | /* NCI specification 4.4.2 Connection Creation |
101 | * The combination of destination type and destination specific | |
102 | * parameters shall uniquely identify a single destination for the | |
103 | * Logical Connection | |
104 | */ | |
105 | struct dest_spec_params *dest_params; | |
106 | __u8 dest_type; | |
4aeee687 CR |
107 | __u8 conn_id; |
108 | __u8 max_pkt_payload_len; | |
109 | ||
110 | atomic_t credits_cnt; | |
111 | __u8 initial_num_credits; | |
112 | ||
113 | data_exchange_cb_t data_exchange_cb; | |
114 | void *data_exchange_cb_context; | |
115 | ||
116 | struct sk_buff *rx_skb; | |
117 | }; | |
6a2968aa | 118 | |
af9c8aa6 CR |
119 | #define NCI_INVALID_CONN_ID 0x80 |
120 | ||
11f54f22 CR |
121 | #define NCI_HCI_ANY_OPEN_PIPE 0x03 |
122 | ||
123 | /* Gates */ | |
124 | #define NCI_HCI_ADMIN_GATE 0x00 | |
b1fa4dc4 | 125 | #define NCI_HCI_LOOPBACK_GATE 0x04 |
7e357404 | 126 | #define NCI_HCI_IDENTITY_MGMT_GATE 0x05 |
11f54f22 CR |
127 | #define NCI_HCI_LINK_MGMT_GATE 0x06 |
128 | ||
129 | /* Pipes */ | |
130 | #define NCI_HCI_LINK_MGMT_PIPE 0x00 | |
131 | #define NCI_HCI_ADMIN_PIPE 0x01 | |
132 | ||
133 | /* Generic responses */ | |
134 | #define NCI_HCI_ANY_OK 0x00 | |
135 | #define NCI_HCI_ANY_E_NOT_CONNECTED 0x01 | |
136 | #define NCI_HCI_ANY_E_CMD_PAR_UNKNOWN 0x02 | |
137 | #define NCI_HCI_ANY_E_NOK 0x03 | |
138 | #define NCI_HCI_ANY_E_PIPES_FULL 0x04 | |
139 | #define NCI_HCI_ANY_E_REG_PAR_UNKNOWN 0x05 | |
140 | #define NCI_HCI_ANY_E_PIPE_NOT_OPENED 0x06 | |
141 | #define NCI_HCI_ANY_E_CMD_NOT_SUPPORTED 0x07 | |
142 | #define NCI_HCI_ANY_E_INHIBITED 0x08 | |
143 | #define NCI_HCI_ANY_E_TIMEOUT 0x09 | |
144 | #define NCI_HCI_ANY_E_REG_ACCESS_DENIED 0x0a | |
145 | #define NCI_HCI_ANY_E_PIPE_ACCESS_DENIED 0x0b | |
146 | ||
147 | #define NCI_HCI_DO_NOT_OPEN_PIPE 0x81 | |
148 | #define NCI_HCI_INVALID_PIPE 0x80 | |
149 | #define NCI_HCI_INVALID_GATE 0xFF | |
150 | #define NCI_HCI_INVALID_HOST 0x80 | |
151 | ||
152 | #define NCI_HCI_MAX_CUSTOM_GATES 50 | |
1f74f323 CR |
153 | /* |
154 | * According to specification 102 622 chapter 4.4 Pipes, | |
155 | * the pipe identifier is 7 bits long. | |
156 | */ | |
6491d698 | 157 | #define NCI_HCI_MAX_PIPES 128 |
11f54f22 CR |
158 | |
159 | struct nci_hci_gate { | |
160 | u8 gate; | |
161 | u8 pipe; | |
162 | u8 dest_host; | |
163 | } __packed; | |
164 | ||
165 | struct nci_hci_pipe { | |
166 | u8 gate; | |
167 | u8 host; | |
168 | } __packed; | |
169 | ||
170 | struct nci_hci_init_data { | |
171 | u8 gate_count; | |
172 | struct nci_hci_gate gates[NCI_HCI_MAX_CUSTOM_GATES]; | |
173 | char session_id[9]; | |
174 | }; | |
175 | ||
176 | #define NCI_HCI_MAX_GATES 256 | |
177 | ||
178 | struct nci_hci_dev { | |
15d4a8da | 179 | u8 nfcee_id; |
11f54f22 CR |
180 | struct nci_dev *ndev; |
181 | struct nci_conn_info *conn_info; | |
182 | ||
183 | struct nci_hci_init_data init_data; | |
184 | struct nci_hci_pipe pipes[NCI_HCI_MAX_PIPES]; | |
185 | u8 gate2pipe[NCI_HCI_MAX_GATES]; | |
186 | int expected_pipes; | |
187 | int count_pipes; | |
188 | ||
189 | struct sk_buff_head rx_hcp_frags; | |
190 | struct work_struct msg_rx_work; | |
191 | struct sk_buff_head msg_rx_queue; | |
192 | }; | |
193 | ||
6a2968aa IE |
194 | /* NCI Core structures */ |
195 | struct nci_dev { | |
196 | struct nfc_dev *nfc_dev; | |
197 | struct nci_ops *ops; | |
11f54f22 | 198 | struct nci_hci_dev *hci_dev; |
6a2968aa IE |
199 | |
200 | int tx_headroom; | |
201 | int tx_tailroom; | |
202 | ||
8939e47f | 203 | atomic_t state; |
6a2968aa IE |
204 | unsigned long flags; |
205 | ||
206 | atomic_t cmd_cnt; | |
4aeee687 CR |
207 | __u8 cur_conn_id; |
208 | ||
209 | struct list_head conn_info_list; | |
12bdf27d | 210 | struct nci_conn_info *rf_conn_info; |
6a2968aa IE |
211 | |
212 | struct timer_list cmd_timer; | |
c4bf98b2 | 213 | struct timer_list data_timer; |
6a2968aa IE |
214 | |
215 | struct workqueue_struct *cmd_wq; | |
216 | struct work_struct cmd_work; | |
217 | ||
218 | struct workqueue_struct *rx_wq; | |
219 | struct work_struct rx_work; | |
220 | ||
221 | struct workqueue_struct *tx_wq; | |
222 | struct work_struct tx_work; | |
223 | ||
224 | struct sk_buff_head cmd_q; | |
225 | struct sk_buff_head rx_q; | |
226 | struct sk_buff_head tx_q; | |
227 | ||
228 | struct mutex req_lock; | |
229 | struct completion req_completion; | |
230 | __u32 req_status; | |
231 | __u32 req_result; | |
232 | ||
233 | void *driver_data; | |
234 | ||
235 | __u32 poll_prots; | |
6a2968aa IE |
236 | __u32 target_active_prot; |
237 | ||
019c4fba IE |
238 | struct nfc_target targets[NCI_MAX_DISCOVERED_TARGETS]; |
239 | int n_targets; | |
240 | ||
6a2968aa IE |
241 | /* received during NCI_OP_CORE_RESET_RSP */ |
242 | __u8 nci_ver; | |
243 | ||
244 | /* received during NCI_OP_CORE_INIT_RSP */ | |
245 | __u32 nfcc_features; | |
246 | __u8 num_supported_rf_interfaces; | |
247 | __u8 supported_rf_interfaces | |
248 | [NCI_MAX_SUPPORTED_RF_INTERFACES]; | |
249 | __u8 max_logical_connections; | |
250 | __u16 max_routing_table_size; | |
e8c0dacd IE |
251 | __u8 max_ctrl_pkt_payload_len; |
252 | __u16 max_size_for_large_params; | |
e8c0dacd IE |
253 | __u8 manufact_id; |
254 | __u32 manufact_specific_info; | |
6a2968aa | 255 | |
4aeee687 | 256 | /* Save RF Discovery ID or NFCEE ID under conn_create */ |
9b8d1a4c CR |
257 | struct dest_spec_params cur_params; |
258 | /* Save destination type under conn_create */ | |
259 | __u8 cur_dest_type; | |
637d85a7 | 260 | |
6a2968aa | 261 | /* stored during nci_data_exchange */ |
6a2968aa | 262 | struct sk_buff *rx_data_reassembly; |
767f19ae IE |
263 | |
264 | /* stored during intf_activated_ntf */ | |
265 | __u8 remote_gb[NFC_MAX_GT_LEN]; | |
266 | __u8 remote_gb_len; | |
6a2968aa IE |
267 | }; |
268 | ||
269 | /* ----- NCI Devices ----- */ | |
270 | struct nci_dev *nci_allocate_device(struct nci_ops *ops, | |
eb9bc6e9 SO |
271 | __u32 supported_protocols, |
272 | int tx_headroom, | |
273 | int tx_tailroom); | |
6a2968aa IE |
274 | void nci_free_device(struct nci_dev *ndev); |
275 | int nci_register_device(struct nci_dev *ndev); | |
276 | void nci_unregister_device(struct nci_dev *ndev); | |
11f54f22 CR |
277 | int nci_request(struct nci_dev *ndev, |
278 | void (*req)(struct nci_dev *ndev, | |
279 | unsigned long opt), | |
280 | unsigned long opt, __u32 timeout); | |
759afb8d | 281 | int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, __u8 *payload); |
7bc4824e | 282 | int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len, __u8 *payload); |
025a0cb8 RB |
283 | int nci_core_reset(struct nci_dev *ndev); |
284 | int nci_core_init(struct nci_dev *ndev); | |
759afb8d | 285 | |
1095e69f | 286 | int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); |
e5629d29 | 287 | int nci_send_frame(struct nci_dev *ndev, struct sk_buff *skb); |
22c15bf3 | 288 | int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val); |
6a2968aa | 289 | |
af9c8aa6 | 290 | int nci_nfcee_discover(struct nci_dev *ndev, u8 action); |
f7f793f3 | 291 | int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode); |
b16ae716 CR |
292 | int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type, |
293 | u8 number_destination_params, | |
294 | size_t params_len, | |
736bb957 CR |
295 | struct core_conn_create_dest_spec_params *params); |
296 | int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id); | |
1c53855f CR |
297 | int nci_nfcc_loopback(struct nci_dev *ndev, void *data, size_t data_len, |
298 | struct sk_buff **resp); | |
af9c8aa6 | 299 | |
11f54f22 CR |
300 | struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev); |
301 | int nci_hci_send_event(struct nci_dev *ndev, u8 gate, u8 event, | |
302 | const u8 *param, size_t param_len); | |
303 | int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate, | |
304 | u8 cmd, const u8 *param, size_t param_len, | |
305 | struct sk_buff **skb); | |
306 | int nci_hci_open_pipe(struct nci_dev *ndev, u8 pipe); | |
307 | int nci_hci_connect_gate(struct nci_dev *ndev, u8 dest_host, | |
308 | u8 dest_gate, u8 pipe); | |
309 | int nci_hci_set_param(struct nci_dev *ndev, u8 gate, u8 idx, | |
310 | const u8 *param, size_t param_len); | |
311 | int nci_hci_get_param(struct nci_dev *ndev, u8 gate, u8 idx, | |
312 | struct sk_buff **skb); | |
fa6fbade | 313 | int nci_hci_clear_all_pipes(struct nci_dev *ndev); |
11f54f22 CR |
314 | int nci_hci_dev_session_init(struct nci_dev *ndev); |
315 | ||
6a2968aa | 316 | static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev, |
eb9bc6e9 SO |
317 | unsigned int len, |
318 | gfp_t how) | |
6a2968aa IE |
319 | { |
320 | struct sk_buff *skb; | |
321 | ||
322 | skb = alloc_skb(len + ndev->tx_headroom + ndev->tx_tailroom, how); | |
323 | if (skb) | |
324 | skb_reserve(skb, ndev->tx_headroom); | |
325 | ||
326 | return skb; | |
327 | } | |
328 | ||
329 | static inline void nci_set_parent_dev(struct nci_dev *ndev, struct device *dev) | |
330 | { | |
331 | nfc_set_parent_dev(ndev->nfc_dev, dev); | |
332 | } | |
333 | ||
334 | static inline void nci_set_drvdata(struct nci_dev *ndev, void *data) | |
335 | { | |
336 | ndev->driver_data = data; | |
337 | } | |
338 | ||
339 | static inline void *nci_get_drvdata(struct nci_dev *ndev) | |
340 | { | |
341 | return ndev->driver_data; | |
342 | } | |
343 | ||
8115dd59 SO |
344 | static inline int nci_set_vendor_cmds(struct nci_dev *ndev, |
345 | struct nfc_vendor_cmd *cmds, | |
346 | int n_cmds) | |
347 | { | |
348 | return nfc_set_vendor_cmds(ndev->nfc_dev, cmds, n_cmds); | |
349 | } | |
350 | ||
6a2968aa IE |
351 | void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb); |
352 | void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb); | |
f1163174 | 353 | int nci_prop_rsp_packet(struct nci_dev *ndev, __u16 opcode, |
0a97a3cb | 354 | struct sk_buff *skb); |
f1163174 | 355 | int nci_prop_ntf_packet(struct nci_dev *ndev, __u16 opcode, |
0a97a3cb | 356 | struct sk_buff *skb); |
f1163174 | 357 | int nci_core_rsp_packet(struct nci_dev *ndev, __u16 opcode, |
b6355e97 | 358 | struct sk_buff *skb); |
f1163174 | 359 | int nci_core_ntf_packet(struct nci_dev *ndev, __u16 opcode, |
b6355e97 | 360 | struct sk_buff *skb); |
6a2968aa IE |
361 | void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb); |
362 | int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload); | |
363 | int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb); | |
2663589c | 364 | int nci_conn_max_data_pkt_payload_size(struct nci_dev *ndev, __u8 conn_id); |
6a2968aa | 365 | void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb, |
4aeee687 | 366 | __u8 conn_id, int err); |
11f54f22 CR |
367 | void nci_hci_data_received_cb(void *context, struct sk_buff *skb, int err); |
368 | ||
019c4fba | 369 | void nci_clear_target_list(struct nci_dev *ndev); |
6a2968aa IE |
370 | |
371 | /* ----- NCI requests ----- */ | |
372 | #define NCI_REQ_DONE 0 | |
373 | #define NCI_REQ_PEND 1 | |
374 | #define NCI_REQ_CANCELED 2 | |
375 | ||
376 | void nci_req_complete(struct nci_dev *ndev, int result); | |
4aeee687 CR |
377 | struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev, |
378 | int conn_id); | |
9b8d1a4c CR |
379 | int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type, |
380 | struct dest_spec_params *params); | |
6a2968aa IE |
381 | |
382 | /* ----- NCI status code ----- */ | |
383 | int nci_to_errno(__u8 code); | |
384 | ||
8a00a61b FD |
385 | /* ----- NCI over SPI acknowledge modes ----- */ |
386 | #define NCI_SPI_CRC_DISABLED 0x00 | |
387 | #define NCI_SPI_CRC_ENABLED 0x01 | |
388 | ||
389 | /* ----- NCI SPI structures ----- */ | |
fa544fff | 390 | struct nci_spi { |
d5937511 | 391 | struct nci_dev *ndev; |
8a00a61b | 392 | struct spi_device *spi; |
8a00a61b FD |
393 | |
394 | unsigned int xfer_udelay; /* microseconds delay between | |
395 | transactions */ | |
2bd83245 VC |
396 | |
397 | unsigned int xfer_speed_hz; /* | |
398 | * SPI clock frequency | |
399 | * 0 => default clock | |
400 | */ | |
401 | ||
8a00a61b FD |
402 | u8 acknowledge_mode; |
403 | ||
ee9596d4 FD |
404 | struct completion req_completion; |
405 | u8 req_result; | |
8a00a61b FD |
406 | }; |
407 | ||
fa544fff EL |
408 | /* ----- NCI SPI ----- */ |
409 | struct nci_spi *nci_spi_allocate_spi(struct spi_device *spi, | |
fa544fff EL |
410 | u8 acknowledge_mode, unsigned int delay, |
411 | struct nci_dev *ndev); | |
2bed2785 EL |
412 | int nci_spi_send(struct nci_spi *nspi, |
413 | struct completion *write_handshake_completion, | |
414 | struct sk_buff *skb); | |
22d4aae5 | 415 | struct sk_buff *nci_spi_read(struct nci_spi *nspi); |
8a00a61b | 416 | |
9961127d VC |
417 | /* ----- NCI UART ---- */ |
418 | ||
419 | /* Ioctl */ | |
420 | #define NCIUARTSETDRIVER _IOW('U', 0, char *) | |
421 | ||
422 | enum nci_uart_driver { | |
423 | NCI_UART_DRIVER_MARVELL = 0, | |
424 | NCI_UART_DRIVER_MAX | |
425 | }; | |
426 | ||
427 | struct nci_uart; | |
428 | ||
429 | struct nci_uart_ops { | |
430 | int (*open)(struct nci_uart *nci_uart); | |
431 | void (*close)(struct nci_uart *nci_uart); | |
432 | int (*recv)(struct nci_uart *nci_uart, struct sk_buff *skb); | |
433 | int (*recv_buf)(struct nci_uart *nci_uart, const u8 *data, char *flags, | |
434 | int count); | |
435 | int (*send)(struct nci_uart *nci_uart, struct sk_buff *skb); | |
436 | void (*tx_start)(struct nci_uart *nci_uart); | |
437 | void (*tx_done)(struct nci_uart *nci_uart); | |
438 | }; | |
439 | ||
440 | struct nci_uart { | |
441 | struct module *owner; | |
442 | struct nci_uart_ops ops; | |
443 | const char *name; | |
444 | enum nci_uart_driver driver; | |
445 | ||
446 | /* Dynamic data */ | |
447 | struct nci_dev *ndev; | |
448 | spinlock_t rx_lock; | |
449 | struct work_struct write_work; | |
450 | struct tty_struct *tty; | |
451 | unsigned long tx_state; | |
452 | struct sk_buff_head tx_q; | |
453 | struct sk_buff *tx_skb; | |
454 | struct sk_buff *rx_skb; | |
455 | int rx_packet_len; | |
456 | void *drv_data; | |
457 | }; | |
458 | ||
459 | int nci_uart_register(struct nci_uart *nu); | |
460 | void nci_uart_unregister(struct nci_uart *nu); | |
461 | void nci_uart_set_config(struct nci_uart *nu, int baudrate, int flow_ctrl); | |
462 | ||
6a2968aa | 463 | #endif /* __NCI_CORE_H */ |