No empty .Rs/.Re
[netbsd-mini2440.git] / sys / dev / ieee1394 / firewire.h
blob89a4b12152c3a7d1f8461e7ba5505e0cf4cfca04
1 /* $NetBSD: firewire.h,v 1.3 2006/11/16 15:59:28 jdolecek Exp $ */
2 /*-
3 * Copyright (c) 2003 Hidetoshi Shimokawa
4 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
5 * All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the acknowledgement as bellow:
18 * This product includes software developed by K. Kobayashi and H. Shimokawa
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
35 * $FreeBSD: src/sys/dev/firewire/firewire.h,v 1.21 2007/04/24 12:15:05 simokawa Exp $
39 #ifndef _FIREWIRE_H
40 #define _FIREWIRE_H 1
42 #define DEV_DEF 0
43 #define DEV_DV 2
45 struct fw_isochreq {
46 unsigned char ch:6,
47 tag:2;
50 struct fw_isobufreq {
51 struct fw_bufspec {
52 unsigned int nchunk;
53 unsigned int npacket;
54 unsigned int psize;
55 } tx, rx;
58 struct fw_addr {
59 uint32_t hi;
60 uint32_t lo;
63 struct fw_asybindreq {
64 struct fw_addr start;
65 unsigned long len;
68 struct fw_reg_req_t {
69 uint32_t addr;
70 uint32_t data;
73 #define MAXREC(x) (2 << (x))
74 #define FWPMAX_S400 (2048 + 20) /* MAXREC plus space for control data */
75 #define FWMAXQUEUE 256
77 #define FWLOCALBUS 0xffc0
79 #define FWTCODE_WREQQ 0
80 #define FWTCODE_WREQB 1
81 #define FWTCODE_WRES 2
82 #define FWTCODE_RREQQ 4
83 #define FWTCODE_RREQB 5
84 #define FWTCODE_RRESQ 6
85 #define FWTCODE_RRESB 7
86 #define FWTCODE_CYCS 8
87 #define FWTCODE_LREQ 9
88 #define FWTCODE_STREAM 0xa
89 #define FWTCODE_LRES 0xb
90 #define FWTCODE_PHY 0xe
92 #define FWRETRY_1 0
93 #define FWRETRY_X 1
94 #define FWRETRY_A 2
95 #define FWRETRY_B 3
97 #define FWRCODE_COMPLETE 0
98 #define FWRCODE_ER_CONFL 4
99 #define FWRCODE_ER_DATA 5
100 #define FWRCODE_ER_TYPE 6
101 #define FWRCODE_ER_ADDR 7
103 #define FWSPD_S100 0
104 #define FWSPD_S200 1
105 #define FWSPD_S400 2
107 #define FWP_TL_VALID (1 << 7)
109 struct fw_isohdr {
110 uint32_t hdr[1];
113 struct fw_asyhdr {
114 uint32_t hdr[4];
117 #if BYTE_ORDER == BIG_ENDIAN
118 #define BIT4x2(x,y) uint8_t x:4, y:4
119 #define BIT16x2(x,y) uint32_t x:16, y:16
120 #else
121 #define BIT4x2(x,y) uint8_t y:4, x:4
122 #define BIT16x2(x,y) uint32_t y:16, x:16
123 #endif
126 #if BYTE_ORDER == BIG_ENDIAN
127 #define COMMON_HDR(a,b,c,d) uint32_t a:16,b:8,c:4,d:4
128 #define COMMON_RES(a,b,c,d) uint32_t a:16,b:4,c:4,d:8
129 #else
130 #define COMMON_HDR(a,b,c,d) uint32_t d:4,c:4,b:8,a:16
131 #define COMMON_RES(a,b,c,d) uint32_t d:8,c:4,b:4,a:16
132 #endif
134 struct fw_pkt {
135 union {
136 uint32_t ld[0];
137 struct {
138 COMMON_HDR(, , tcode, );
139 } common;
140 struct {
141 COMMON_HDR(len, chtag, tcode, sy);
142 uint32_t payload[0];
143 } stream;
144 struct {
145 COMMON_HDR(dst, tlrt, tcode, pri);
146 BIT16x2(src, );
147 } hdr;
148 struct {
149 COMMON_HDR(dst, tlrt, tcode, pri);
150 BIT16x2(src, dest_hi);
151 uint32_t dest_lo;
152 } rreqq;
153 struct {
154 COMMON_HDR(dst, tlrt, tcode, pri);
155 COMMON_RES(src, rtcode, , );
156 uint32_t :32;
157 } wres;
158 struct {
159 COMMON_HDR(dst, tlrt, tcode, pri);
160 BIT16x2(src, dest_hi);
161 uint32_t dest_lo;
162 BIT16x2(len, extcode);
163 } rreqb;
164 struct {
165 COMMON_HDR(dst, tlrt, tcode, pri);
166 BIT16x2(src, dest_hi);
167 uint32_t dest_lo;
168 uint32_t data;
169 } wreqq;
170 struct {
171 COMMON_HDR(dst, tlrt, tcode, pri);
172 BIT16x2(src, dest_hi);
173 uint32_t dest_lo;
174 uint32_t data;
175 } cyc;
176 struct {
177 COMMON_HDR(dst, tlrt, tcode, pri);
178 COMMON_RES(src, rtcode, , );
179 uint32_t :32;
180 uint32_t data;
181 } rresq;
182 struct {
183 COMMON_HDR(dst, tlrt, tcode, pri);
184 BIT16x2(src, dest_hi);
185 uint32_t dest_lo;
186 BIT16x2(len, extcode);
187 uint32_t payload[0];
188 } wreqb;
189 struct {
190 COMMON_HDR(dst, tlrt, tcode, pri);
191 BIT16x2(src, dest_hi);
192 uint32_t dest_lo;
193 BIT16x2(len, extcode);
194 uint32_t payload[0];
195 } lreq;
196 struct {
197 COMMON_HDR(dst, tlrt, tcode, pri);
198 COMMON_RES(src, rtcode, , );
199 uint32_t :32;
200 BIT16x2(len, extcode);
201 uint32_t payload[0];
202 } rresb;
203 struct {
204 COMMON_HDR(dst, tlrt, tcode, pri);
205 COMMON_RES(src, rtcode, , );
206 uint32_t :32;
207 BIT16x2(len, extcode);
208 uint32_t payload[0];
209 } lres;
210 } mode;
214 * Response code (rtcode)
216 /* The node has successfully completed the command. */
217 #define RESP_CMP 0
218 /* A resource conflict was detected. The request may be retried. */
219 #define RESP_CONFLICT_ERROR 4
220 /* Hardware error, data is unavailable. */
221 #define RESP_DATA_ERROR 5
222 /* A field in the request packet header was set to an unsupported or incorrect
223 * value, or an invalid transaction was attempted (e.g., a write to a read-only
224 * address). */
225 #define RESP_TYPE_ERROR 6
226 /* The destination offset field in the request was set to an address not
227 * accessible in the destination node. */
228 #define RESP_ADDRESS_ERROR 7
231 * Extended transaction code (extcode)
233 #define EXTCODE_MASK_SWAP 1
234 #define EXTCODE_CMP_SWAP 2
235 #define EXTCODE_FETCH_ADD 3
236 #define EXTCODE_LITTLE_ADD 4
237 #define EXTCODE_BOUNDED_ADD 5
238 #define EXTCODE_WRAP_ADD 6
240 struct fw_eui64 {
241 uint32_t hi, lo;
243 #define FW_EUI64_BYTE(eui, x) \
244 ((((x)<4)? \
245 ((eui)->hi >> (8*(3-(x)))): \
246 ((eui)->lo >> (8*(7-(x)))) \
247 ) & 0xff)
248 #define FW_EUI64_EQUAL(x, y) \
249 ((x).hi == (y).hi && (x).lo == (y).lo)
251 struct fw_asyreq {
252 struct fw_asyreq_t{
253 unsigned char sped;
254 unsigned int type;
255 #define FWASREQNODE 0
256 #define FWASREQEUI 1
257 #define FWASRESTL 2
258 #define FWASREQSTREAM 3
259 unsigned short len;
260 union {
261 struct fw_eui64 eui;
262 }dst;
263 }req;
264 struct fw_pkt pkt;
265 uint32_t data[512];
268 struct fw_devinfo {
269 struct fw_eui64 eui;
270 uint16_t dst;
271 uint16_t status;
274 #define FW_MAX_DEVLST 70
275 struct fw_devlstreq {
276 uint16_t n;
277 uint16_t info_len;
278 struct fw_devinfo dev[FW_MAX_DEVLST];
281 #define FW_SELF_ID_PORT_CONNECTED_TO_CHILD 3
282 #define FW_SELF_ID_PORT_CONNECTED_TO_PARENT 2
283 #define FW_SELF_ID_PORT_NOT_CONNECTED 1
284 #define FW_SELF_ID_PORT_NOT_EXISTS 0
285 #if BYTE_ORDER == BIG_ENDIAN
286 union fw_self_id {
287 struct {
288 uint32_t id:2,
289 phy_id:6,
290 sequel:1,
291 link_active:1,
292 gap_count:6,
293 phy_speed:2,
294 phy_delay:2,
295 contender:1,
296 power_class:3,
297 port0:2,
298 port1:2,
299 port2:2,
300 initiated_reset:1,
301 more_packets:1;
302 } p0;
303 struct {
304 uint32_t
305 id:2,
306 phy_id:6,
307 sequel:1,
308 sequence_num:3,
310 porta:2,
311 portb:2,
312 portc:2,
313 portd:2,
314 porte:2,
315 portf:2,
316 portg:2,
317 porth:2,
319 more_packets:1;
320 } p1;
322 #else
323 union fw_self_id {
324 struct {
325 uint32_t more_packets:1,
326 initiated_reset:1,
327 port2:2,
328 port1:2,
329 port0:2,
330 power_class:3,
331 contender:1,
332 phy_delay:2,
333 phy_speed:2,
334 gap_count:6,
335 link_active:1,
336 sequel:1,
337 phy_id:6,
338 id:2;
339 } p0;
340 struct {
341 uint32_t more_packets:1,
342 reserved1:1,
343 porth:2,
344 portg:2,
345 portf:2,
346 porte:2,
347 portd:2,
348 portc:2,
349 portb:2,
350 porta:2,
351 reserved2:2,
352 sequence_num:3,
353 sequel:1,
354 phy_id:6,
355 id:2;
356 } p1;
358 #endif
361 struct fw_topology_map {
362 uint32_t crc:16,
363 crc_len:16;
364 uint32_t generation;
365 uint32_t self_id_count:16,
366 node_count:16;
367 union fw_self_id self_id[4*64];
370 struct fw_speed_map {
371 uint32_t crc:16,
372 crc_len:16;
373 uint32_t generation;
374 uint8_t speed[64][64];
377 struct fw_crom_buf {
378 struct fw_eui64 eui;
379 uint32_t len;
380 void *ptr;
384 * FireWire specific system requests.
386 #define FW_SSTBUF _IOWR('S', 86, struct fw_isobufreq)
387 #define FW_GSTBUF _IOWR('S', 87, struct fw_isobufreq)
388 #define FW_SRSTREAM _IOWR('S', 88, struct fw_isochreq)
389 #define FW_GRSTREAM _IOWR('S', 89, struct fw_isochreq)
390 #define FW_STSTREAM _IOWR('S', 90, struct fw_isochreq)
391 #define FW_GTSTREAM _IOWR('S', 91, struct fw_isochreq)
393 #define FW_ASYREQ _IOWR('S', 92, struct fw_asyreq)
394 #define FW_IBUSRST _IOR('S', 1, unsigned int)
395 #define FW_GDEVLST _IOWR('S', 2, struct fw_devlstreq)
396 #define FW_SBINDADDR _IOWR('S', 3, struct fw_asybindreq)
397 #define FW_CBINDADDR _IOWR('S', 4, struct fw_asybindreq)
398 #define FW_GTPMAP _IOR('S', 5, struct fw_topology_map)
399 #define FW_GCROM _IOWR('S', 7, struct fw_crom_buf)
401 #define FW_SDEUI64 _IOW('S', 20, struct fw_eui64)
402 #define FW_GDEUI64 _IOR('S', 21, struct fw_eui64)
404 #define FWOHCI_RDREG _IOWR('S', 80, struct fw_reg_req_t)
405 #define FWOHCI_WRREG _IOWR('S', 81, struct fw_reg_req_t)
406 #define FWOHCI_RDPHYREG _IOWR('S', 82, struct fw_reg_req_t)
407 #define FWOHCI_WRPHYREG _IOWR('S', 83, struct fw_reg_req_t)
409 #define DUMPDMA _IOWR('S', 82, uint32_t)
411 #ifdef _KERNEL
413 #define FWMAXNDMA 0x100 /* 8 bits DMA channel id. in device No. */
415 #define MAKEMINOR(f, u, s) \
416 fw_unit2minor((f) | (((u) & 0xff) << 8) | (s & 0xff))
417 #define DEV2UNIT(x) ((fw_dev2unit(x) & 0xff00) >> 8)
418 #define DEV2SUB(x) (fw_dev2unit(x) & 0xff)
419 #define FW_UNITMASK MAKEMINOR(0, -1, 0)
420 #define FW_UNIT(unit) MAKEMINOR(0, unit, 0)
422 #define FWMEM_FLAG 0x10000
423 #define DEV_FWMEM(x) (fw_dev2unit(x) & FWMEM_FLAG)
425 struct fw_attach_args {
426 const char *name;
427 struct firewire_comm *fc;
428 struct fw_device *fwdev;
431 #endif
432 #endif