]> Pileus Git - ~andy/linux/blob - include/net/nfc/nci_core.h
Merge branch 'omap/dt-missed-3.4' into drivers/mmc
[~andy/linux] / include / net / nfc / nci_core.h
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 flags */
38 enum nci_flag {
39         NCI_INIT,
40         NCI_UP,
41         NCI_DATA_EXCHANGE,
42         NCI_DATA_EXCHANGE_TO,
43 };
44
45 /* NCI device states */
46 enum nci_state {
47         NCI_IDLE,
48         NCI_DISCOVERY,
49         NCI_W4_ALL_DISCOVERIES,
50         NCI_W4_HOST_SELECT,
51         NCI_POLL_ACTIVE,
52 };
53
54 /* NCI timeouts */
55 #define NCI_RESET_TIMEOUT                       5000
56 #define NCI_INIT_TIMEOUT                        5000
57 #define NCI_RF_DISC_TIMEOUT                     5000
58 #define NCI_RF_DISC_SELECT_TIMEOUT              5000
59 #define NCI_RF_DEACTIVATE_TIMEOUT               30000
60 #define NCI_CMD_TIMEOUT                         5000
61 #define NCI_DATA_TIMEOUT                        700
62
63 struct nci_dev;
64
65 struct nci_ops {
66         int (*open)(struct nci_dev *ndev);
67         int (*close)(struct nci_dev *ndev);
68         int (*send)(struct sk_buff *skb);
69 };
70
71 #define NCI_MAX_SUPPORTED_RF_INTERFACES         4
72 #define NCI_MAX_DISCOVERED_TARGETS              10
73
74 /* NCI Core structures */
75 struct nci_dev {
76         struct nfc_dev          *nfc_dev;
77         struct nci_ops          *ops;
78
79         int                     tx_headroom;
80         int                     tx_tailroom;
81
82         atomic_t                state;
83         unsigned long           flags;
84
85         atomic_t                cmd_cnt;
86         atomic_t                credits_cnt;
87
88         struct timer_list       cmd_timer;
89         struct timer_list       data_timer;
90
91         struct workqueue_struct *cmd_wq;
92         struct work_struct      cmd_work;
93
94         struct workqueue_struct *rx_wq;
95         struct work_struct      rx_work;
96
97         struct workqueue_struct *tx_wq;
98         struct work_struct      tx_work;
99
100         struct sk_buff_head     cmd_q;
101         struct sk_buff_head     rx_q;
102         struct sk_buff_head     tx_q;
103
104         struct mutex            req_lock;
105         struct completion       req_completion;
106         __u32                   req_status;
107         __u32                   req_result;
108
109         void                    *driver_data;
110
111         __u32                   poll_prots;
112         __u32                   target_active_prot;
113
114         struct nfc_target       targets[NCI_MAX_DISCOVERED_TARGETS];
115         int                     n_targets;
116
117         /* received during NCI_OP_CORE_RESET_RSP */
118         __u8                    nci_ver;
119
120         /* received during NCI_OP_CORE_INIT_RSP */
121         __u32                   nfcc_features;
122         __u8                    num_supported_rf_interfaces;
123         __u8                    supported_rf_interfaces
124                                 [NCI_MAX_SUPPORTED_RF_INTERFACES];
125         __u8                    max_logical_connections;
126         __u16                   max_routing_table_size;
127         __u8                    max_ctrl_pkt_payload_len;
128         __u16                   max_size_for_large_params;
129         __u8                    manufact_id;
130         __u32                   manufact_specific_info;
131
132         /* received during NCI_OP_RF_INTF_ACTIVATED_NTF */
133         __u8                    max_data_pkt_payload_size;
134         __u8                    initial_num_credits;
135
136         /* stored during nci_data_exchange */
137         data_exchange_cb_t      data_exchange_cb;
138         void                    *data_exchange_cb_context;
139         struct sk_buff          *rx_data_reassembly;
140 };
141
142 /* ----- NCI Devices ----- */
143 struct nci_dev *nci_allocate_device(struct nci_ops *ops,
144                                     __u32 supported_protocols,
145                                     int tx_headroom,
146                                     int tx_tailroom);
147 void nci_free_device(struct nci_dev *ndev);
148 int nci_register_device(struct nci_dev *ndev);
149 void nci_unregister_device(struct nci_dev *ndev);
150 int nci_recv_frame(struct sk_buff *skb);
151
152 static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev,
153                                             unsigned int len,
154                                             gfp_t how)
155 {
156         struct sk_buff *skb;
157
158         skb = alloc_skb(len + ndev->tx_headroom + ndev->tx_tailroom, how);
159         if (skb)
160                 skb_reserve(skb, ndev->tx_headroom);
161
162         return skb;
163 }
164
165 static inline void nci_set_parent_dev(struct nci_dev *ndev, struct device *dev)
166 {
167         nfc_set_parent_dev(ndev->nfc_dev, dev);
168 }
169
170 static inline void nci_set_drvdata(struct nci_dev *ndev, void *data)
171 {
172         ndev->driver_data = data;
173 }
174
175 static inline void *nci_get_drvdata(struct nci_dev *ndev)
176 {
177         return ndev->driver_data;
178 }
179
180 void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb);
181 void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb);
182 void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb);
183 int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload);
184 int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb);
185 void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb,
186                                 int err);
187 void nci_clear_target_list(struct nci_dev *ndev);
188
189 /* ----- NCI requests ----- */
190 #define NCI_REQ_DONE            0
191 #define NCI_REQ_PEND            1
192 #define NCI_REQ_CANCELED        2
193
194 void nci_req_complete(struct nci_dev *ndev, int result);
195
196 /* ----- NCI status code ----- */
197 int nci_to_errno(__u8 code);
198
199 #endif /* __NCI_CORE_H */