1/*
2 * Char device interface.
3 *
4 * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21#ifndef _LINUX_FIREWIRE_CDEV_H
22#define _LINUX_FIREWIRE_CDEV_H
23
24#include <linux/ioctl.h>
25#include <linux/types.h>
26#include <linux/firewire-constants.h>
27
28#define FW_CDEV_EVENT_BUS_RESET		0x00
29#define FW_CDEV_EVENT_RESPONSE		0x01
30#define FW_CDEV_EVENT_REQUEST		0x02
31#define FW_CDEV_EVENT_ISO_INTERRUPT	0x03
32
33/* The 'closure' fields are for user space to use.  Data passed in the
34 * 'closure' field for a request will be returned in the corresponding
35 * event.  It's a 64-bit type so that it's a fixed size type big
36 * enough to hold a pointer on all platforms. */
37
38struct fw_cdev_event_common {
39	__u64 closure;
40	__u32 type;
41};
42
43struct fw_cdev_event_bus_reset {
44	__u64 closure;
45	__u32 type;
46	__u32 node_id;
47	__u32 local_node_id;
48	__u32 bm_node_id;
49	__u32 irm_node_id;
50	__u32 root_node_id;
51	__u32 generation;
52};
53
54struct fw_cdev_event_response {
55	__u64 closure;
56	__u32 type;
57	__u32 rcode;
58	__u32 length;
59	__u32 data[0];
60};
61
62struct fw_cdev_event_request {
63	__u64 closure;
64	__u32 type;
65	__u32 tcode;
66	__u64 offset;
67	__u32 handle;
68	__u32 length;
69	__u32 data[0];
70};
71
72struct fw_cdev_event_iso_interrupt {
73	__u64 closure;
74	__u32 type;
75	__u32 cycle;
76	__u32 header_length;	/* Length in bytes of following headers. */
77	__u32 header[0];
78};
79
80union fw_cdev_event {
81	struct fw_cdev_event_common common;
82	struct fw_cdev_event_bus_reset bus_reset;
83	struct fw_cdev_event_response response;
84	struct fw_cdev_event_request request;
85	struct fw_cdev_event_iso_interrupt iso_interrupt;
86};
87
88#define FW_CDEV_IOC_GET_INFO		_IOWR('#', 0x00, struct fw_cdev_get_info)
89#define FW_CDEV_IOC_SEND_REQUEST	_IOW('#', 0x01, struct fw_cdev_send_request)
90#define FW_CDEV_IOC_ALLOCATE		_IOWR('#', 0x02, struct fw_cdev_allocate)
91#define FW_CDEV_IOC_DEALLOCATE		_IOW('#', 0x03, struct fw_cdev_deallocate)
92#define FW_CDEV_IOC_SEND_RESPONSE	_IOW('#', 0x04, struct fw_cdev_send_response)
93#define FW_CDEV_IOC_INITIATE_BUS_RESET	_IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
94#define FW_CDEV_IOC_ADD_DESCRIPTOR	_IOWR('#', 0x06, struct fw_cdev_add_descriptor)
95#define FW_CDEV_IOC_REMOVE_DESCRIPTOR	_IOW('#', 0x07, struct fw_cdev_remove_descriptor)
96
97#define FW_CDEV_IOC_CREATE_ISO_CONTEXT	_IOWR('#', 0x08, struct fw_cdev_create_iso_context)
98#define FW_CDEV_IOC_QUEUE_ISO		_IOWR('#', 0x09, struct fw_cdev_queue_iso)
99#define FW_CDEV_IOC_START_ISO		_IOW('#', 0x0a, struct fw_cdev_start_iso)
100#define FW_CDEV_IOC_STOP_ISO		_IOW('#', 0x0b, struct fw_cdev_stop_iso)
101
102/* FW_CDEV_VERSION History
103 *
104 * 1	Feb 18, 2007:  Initial version.
105 */
106#define FW_CDEV_VERSION		1
107
108struct fw_cdev_get_info {
109	/* The version field is just a running serial number.  We
110	 * never break backwards compatibility.  Userspace passes in
111	 * the version it expects and the kernel passes back the
112	 * highest version it can provide.  Even if the structs in
113	 * this interface are extended in a later version, the kernel
114	 * will not copy back more data than what was present in the
115	 * interface version userspace expects. */
116	__u32 version;
117
118	/* If non-zero, at most rom_length bytes of config rom will be
119	 * copied into that user space address.  In either case,
120	 * rom_length is updated with the actual length of the config
121	 * rom. */
122	__u32 rom_length;
123	__u64 rom;
124
125	/* If non-zero, a fw_cdev_event_bus_reset struct will be
126	 * copied here with the current state of the bus.  This does
127	 * not cause a bus reset to happen.  The value of closure in
128	 * this and sub-sequent bus reset events is set to
129	 * bus_reset_closure. */
130	__u64 bus_reset;
131	__u64 bus_reset_closure;
132
133	/* The index of the card this devices belongs to. */
134	__u32 card;
135};
136
137struct fw_cdev_send_request {
138	__u32 tcode;
139	__u32 length;
140	__u64 offset;
141	__u64 closure;
142	__u64 data;
143	__u32 generation;
144};
145
146struct fw_cdev_send_response {
147	__u32 rcode;
148	__u32 length;
149	__u64 data;
150	__u32 handle;
151};
152
153struct fw_cdev_allocate {
154	__u64 offset;
155	__u64 closure;
156	__u32 length;
157	__u32 handle;
158};
159
160struct fw_cdev_deallocate {
161	__u32 handle;
162};
163
164#define FW_CDEV_LONG_RESET	0
165#define FW_CDEV_SHORT_RESET	1
166
167struct fw_cdev_initiate_bus_reset {
168	__u32 type;
169};
170
171struct fw_cdev_add_descriptor {
172	__u32 immediate;
173	__u32 key;
174	__u64 data;
175	__u32 length;
176	__u32 handle;
177};
178
179struct fw_cdev_remove_descriptor {
180	__u32 handle;
181};
182
183#define FW_CDEV_ISO_CONTEXT_TRANSMIT	0
184#define FW_CDEV_ISO_CONTEXT_RECEIVE	1
185
186#define FW_CDEV_ISO_CONTEXT_MATCH_TAG0		 1
187#define FW_CDEV_ISO_CONTEXT_MATCH_TAG1		 2
188#define FW_CDEV_ISO_CONTEXT_MATCH_TAG2		 4
189#define FW_CDEV_ISO_CONTEXT_MATCH_TAG3		 8
190#define FW_CDEV_ISO_CONTEXT_MATCH_ALL_TAGS	15
191
192struct fw_cdev_create_iso_context {
193	__u32 type;
194	__u32 header_size;
195	__u32 channel;
196	__u32 speed;
197	__u64 closure;
198	__u32 handle;
199};
200
201#define FW_CDEV_ISO_PAYLOAD_LENGTH(v)	(v)
202#define FW_CDEV_ISO_INTERRUPT		(1 << 16)
203#define FW_CDEV_ISO_SKIP		(1 << 17)
204#define FW_CDEV_ISO_TAG(v)		((v) << 18)
205#define FW_CDEV_ISO_SY(v)		((v) << 20)
206#define FW_CDEV_ISO_HEADER_LENGTH(v)	((v) << 24)
207
208struct fw_cdev_iso_packet {
209	__u32 control;
210	__u32 header[0];
211};
212
213struct fw_cdev_queue_iso {
214	__u64 packets;
215	__u64 data;
216	__u32 size;
217	__u32 handle;
218};
219
220struct fw_cdev_start_iso {
221	__s32 cycle;
222	__u32 sync;
223	__u32 tags;
224	__u32 handle;
225};
226
227struct fw_cdev_stop_iso {
228	__u32 handle;
229};
230
231#endif /* _LINUX_FIREWIRE_CDEV_H */
232