Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  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 */
 38enum nci_flag {
 39	NCI_INIT,
 40	NCI_UP,
 41	NCI_DATA_EXCHANGE,
 42	NCI_DATA_EXCHANGE_TO,
 43};
 44
 45/* NCI device states */
 46enum 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
 63struct nci_dev;
 64
 65struct 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 */
 75struct 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 ----- */
143struct nci_dev *nci_allocate_device(struct nci_ops *ops,
144				    __u32 supported_protocols,
145				    int tx_headroom,
146				    int tx_tailroom);
147void nci_free_device(struct nci_dev *ndev);
148int nci_register_device(struct nci_dev *ndev);
149void nci_unregister_device(struct nci_dev *ndev);
150int nci_recv_frame(struct sk_buff *skb);
151
152static 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
165static 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
170static inline void nci_set_drvdata(struct nci_dev *ndev, void *data)
171{
172	ndev->driver_data = data;
173}
174
175static inline void *nci_get_drvdata(struct nci_dev *ndev)
176{
177	return ndev->driver_data;
178}
179
180void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb);
181void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb);
182void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb);
183int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload);
184int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb);
185void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb,
186				int err);
187void 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
194void nci_req_complete(struct nci_dev *ndev, int result);
195
196/* ----- NCI status code ----- */
197int nci_to_errno(__u8 code);
198
199#endif /* __NCI_CORE_H */