xref: /freebsd-src/sys/dev/firewire/firewire.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1098ca2bdSWarner Losh /*-
2*718cf2ccSPedro F. Giffuni  * SPDX-License-Identifier: BSD-4-Clause
3*718cf2ccSPedro F. Giffuni  *
477ee030bSHidetoshi Shimokawa  * Copyright (c) 2003 Hidetoshi Shimokawa
53c60ba66SKatsushi Kobayashi  * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
63c60ba66SKatsushi Kobayashi  * All rights reserved.
73c60ba66SKatsushi Kobayashi  *
83c60ba66SKatsushi Kobayashi  * Redistribution and use in source and binary forms, with or without
93c60ba66SKatsushi Kobayashi  * modification, are permitted provided that the following conditions
103c60ba66SKatsushi Kobayashi  * are met:
113c60ba66SKatsushi Kobayashi  * 1. Redistributions of source code must retain the above copyright
123c60ba66SKatsushi Kobayashi  *    notice, this list of conditions and the following disclaimer.
133c60ba66SKatsushi Kobayashi  * 2. Redistributions in binary form must reproduce the above copyright
143c60ba66SKatsushi Kobayashi  *    notice, this list of conditions and the following disclaimer in the
153c60ba66SKatsushi Kobayashi  *    documentation and/or other materials provided with the distribution.
163c60ba66SKatsushi Kobayashi  * 3. All advertising materials mentioning features or use of this software
173c60ba66SKatsushi Kobayashi  *    must display the acknowledgement as bellow:
183c60ba66SKatsushi Kobayashi  *
193c60ba66SKatsushi Kobayashi  *    This product includes software developed by K. Kobayashi and H. Shimokawa
203c60ba66SKatsushi Kobayashi  *
213c60ba66SKatsushi Kobayashi  * 4. The name of the author may not be used to endorse or promote products
223c60ba66SKatsushi Kobayashi  *    derived from this software without specific prior written permission.
233c60ba66SKatsushi Kobayashi  *
243c60ba66SKatsushi Kobayashi  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
253c60ba66SKatsushi Kobayashi  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
263c60ba66SKatsushi Kobayashi  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
273c60ba66SKatsushi Kobayashi  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
283c60ba66SKatsushi Kobayashi  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
293c60ba66SKatsushi Kobayashi  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
303c60ba66SKatsushi Kobayashi  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
313c60ba66SKatsushi Kobayashi  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
323c60ba66SKatsushi Kobayashi  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
333c60ba66SKatsushi Kobayashi  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
343c60ba66SKatsushi Kobayashi  * POSSIBILITY OF SUCH DAMAGE.
353c60ba66SKatsushi Kobayashi  *
363c60ba66SKatsushi Kobayashi  */
373c60ba66SKatsushi Kobayashi 
383c60ba66SKatsushi Kobayashi #ifndef _FIREWIRE_H
393c60ba66SKatsushi Kobayashi #define _FIREWIRE_H 1
403c60ba66SKatsushi Kobayashi 
413c60ba66SKatsushi Kobayashi #define	DEV_DEF  0
423c60ba66SKatsushi Kobayashi #define	DEV_DV   2
433c60ba66SKatsushi Kobayashi 
443c60ba66SKatsushi Kobayashi struct fw_isochreq {
4523667f08SAlexander Kabaev 	unsigned char ch:6;
4623667f08SAlexander Kabaev 	unsigned char tag:2;
473c60ba66SKatsushi Kobayashi };
483c60ba66SKatsushi Kobayashi 
493c60ba66SKatsushi Kobayashi struct fw_isobufreq {
506cada79aSHidetoshi Shimokawa 	struct fw_bufspec {
513c60ba66SKatsushi Kobayashi 		unsigned int nchunk;
523c60ba66SKatsushi Kobayashi 		unsigned int npacket;
533c60ba66SKatsushi Kobayashi 		unsigned int psize;
543c60ba66SKatsushi Kobayashi 	} tx, rx;
553c60ba66SKatsushi Kobayashi };
563c60ba66SKatsushi Kobayashi 
573c60ba66SKatsushi Kobayashi struct fw_addr {
5803161bbcSDoug Rabson 	uint32_t hi;
5903161bbcSDoug Rabson 	uint32_t lo;
603c60ba66SKatsushi Kobayashi };
613c60ba66SKatsushi Kobayashi 
623c60ba66SKatsushi Kobayashi struct fw_asybindreq {
633c60ba66SKatsushi Kobayashi 	struct fw_addr start;
643c60ba66SKatsushi Kobayashi 	unsigned long len;
653c60ba66SKatsushi Kobayashi };
663c60ba66SKatsushi Kobayashi 
673c60ba66SKatsushi Kobayashi struct fw_reg_req_t {
6803161bbcSDoug Rabson 	uint32_t addr;
6903161bbcSDoug Rabson 	uint32_t data;
703c60ba66SKatsushi Kobayashi };
713c60ba66SKatsushi Kobayashi 
7294b6f028SHidetoshi Shimokawa #define MAXREC(x)	(2 << (x))
733c60ba66SKatsushi Kobayashi #define FWPMAX_S400 (2048 + 20)	/* MAXREC plus space for control data */
7430177c81SHidetoshi Shimokawa #define FWMAXQUEUE 128
753c60ba66SKatsushi Kobayashi 
763c60ba66SKatsushi Kobayashi #define	FWLOCALBUS	0xffc0
773c60ba66SKatsushi Kobayashi 
783c60ba66SKatsushi Kobayashi #define FWTCODE_WREQQ	0
793c60ba66SKatsushi Kobayashi #define FWTCODE_WREQB	1
803c60ba66SKatsushi Kobayashi #define FWTCODE_WRES	2
813c60ba66SKatsushi Kobayashi #define FWTCODE_RREQQ	4
823c60ba66SKatsushi Kobayashi #define FWTCODE_RREQB	5
833c60ba66SKatsushi Kobayashi #define FWTCODE_RRESQ	6
843c60ba66SKatsushi Kobayashi #define FWTCODE_RRESB	7
853c60ba66SKatsushi Kobayashi #define FWTCODE_CYCS	8
863c60ba66SKatsushi Kobayashi #define FWTCODE_LREQ	9
873c60ba66SKatsushi Kobayashi #define FWTCODE_STREAM	0xa
883c60ba66SKatsushi Kobayashi #define FWTCODE_LRES	0xb
893c60ba66SKatsushi Kobayashi #define FWTCODE_PHY	0xe
903c60ba66SKatsushi Kobayashi 
913c60ba66SKatsushi Kobayashi #define	FWRETRY_1	0
923c60ba66SKatsushi Kobayashi #define	FWRETRY_X	1
933c60ba66SKatsushi Kobayashi #define	FWRETRY_A	2
943c60ba66SKatsushi Kobayashi #define	FWRETRY_B	3
953c60ba66SKatsushi Kobayashi 
963c60ba66SKatsushi Kobayashi #define FWRCODE_COMPLETE	0
973c60ba66SKatsushi Kobayashi #define FWRCODE_ER_CONFL	4
983c60ba66SKatsushi Kobayashi #define FWRCODE_ER_DATA		5
993c60ba66SKatsushi Kobayashi #define FWRCODE_ER_TYPE		6
1003c60ba66SKatsushi Kobayashi #define FWRCODE_ER_ADDR		7
1013c60ba66SKatsushi Kobayashi 
102d717909fSSean Bruno /*
103d717909fSSean Bruno  * Defined 1394a-2000
104d717909fSSean Bruno  * Table 5B-1
105d717909fSSean Bruno  */
1063c60ba66SKatsushi Kobayashi #define FWSPD_S100	0
1073c60ba66SKatsushi Kobayashi #define FWSPD_S200	1
1083c60ba66SKatsushi Kobayashi #define FWSPD_S400	2
109d717909fSSean Bruno #define FWSPD_S800	3
110d717909fSSean Bruno #define FWSPD_S1600	4
111d717909fSSean Bruno #define FWSPD_S3200	5
1123c60ba66SKatsushi Kobayashi 
1133c60ba66SKatsushi Kobayashi #define	FWP_TL_VALID (1 << 7)
1143c60ba66SKatsushi Kobayashi 
1153c60ba66SKatsushi Kobayashi struct fw_isohdr {
11603161bbcSDoug Rabson 	uint32_t hdr[1];
1173c60ba66SKatsushi Kobayashi };
118e715bfaeSHidetoshi Shimokawa 
1193c60ba66SKatsushi Kobayashi struct fw_asyhdr {
12003161bbcSDoug Rabson 	uint32_t hdr[4];
1213c60ba66SKatsushi Kobayashi };
122e715bfaeSHidetoshi Shimokawa 
12377ee030bSHidetoshi Shimokawa #if BYTE_ORDER == BIG_ENDIAN
12403161bbcSDoug Rabson #define BIT4x2(x,y)	 uint8_t  x:4, y:4
12503161bbcSDoug Rabson #define BIT16x2(x,y)	uint32_t x:16, y:16
12677ee030bSHidetoshi Shimokawa #else
12703161bbcSDoug Rabson #define BIT4x2(x,y)	 uint8_t  y:4, x:4
12803161bbcSDoug Rabson #define BIT16x2(x,y)	uint32_t y:16, x:16
12977ee030bSHidetoshi Shimokawa #endif
13077ee030bSHidetoshi Shimokawa 
13177ee030bSHidetoshi Shimokawa 
13277ee030bSHidetoshi Shimokawa #if BYTE_ORDER == BIG_ENDIAN
13303161bbcSDoug Rabson #define COMMON_HDR(a,b,c,d)	uint32_t a:16,b:8,c:4,d:4
13403161bbcSDoug Rabson #define COMMON_RES(a,b,c,d)	uint32_t a:16,b:4,c:4,d:8
13577ee030bSHidetoshi Shimokawa #else
13603161bbcSDoug Rabson #define COMMON_HDR(a,b,c,d)	uint32_t d:4,c:4,b:8,a:16
13703161bbcSDoug Rabson #define COMMON_RES(a,b,c,d)	uint32_t d:8,c:4,b:4,a:16
1383c60ba66SKatsushi Kobayashi #endif
139e715bfaeSHidetoshi Shimokawa 
140e715bfaeSHidetoshi Shimokawa struct fw_pkt {
141e715bfaeSHidetoshi Shimokawa 	union {
14203161bbcSDoug Rabson 		uint32_t ld[0];
143e715bfaeSHidetoshi Shimokawa 		struct {
14477ee030bSHidetoshi Shimokawa 			COMMON_HDR(, , tcode, );
145e715bfaeSHidetoshi Shimokawa 		} common;
146e715bfaeSHidetoshi Shimokawa 		struct {
14777ee030bSHidetoshi Shimokawa 			COMMON_HDR(len, chtag, tcode, sy);
14803161bbcSDoug Rabson 			uint32_t payload[0];
149e715bfaeSHidetoshi Shimokawa 		} stream;
150e715bfaeSHidetoshi Shimokawa 		struct {
15177ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
15277ee030bSHidetoshi Shimokawa 			BIT16x2(src, );
153e715bfaeSHidetoshi Shimokawa 		} hdr;
154e715bfaeSHidetoshi Shimokawa 		struct {
15577ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
15677ee030bSHidetoshi Shimokawa 			BIT16x2(src, dest_hi);
15703161bbcSDoug Rabson 			uint32_t dest_lo;
158e715bfaeSHidetoshi Shimokawa 		} rreqq;
159e715bfaeSHidetoshi Shimokawa 		struct {
16077ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
16177ee030bSHidetoshi Shimokawa 			COMMON_RES(src, rtcode, , );
16203161bbcSDoug Rabson 			uint32_t :32;
163e715bfaeSHidetoshi Shimokawa 		} wres;
164e715bfaeSHidetoshi Shimokawa 		struct {
16577ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
16677ee030bSHidetoshi Shimokawa 			BIT16x2(src, dest_hi);
16703161bbcSDoug Rabson 			uint32_t dest_lo;
16877ee030bSHidetoshi Shimokawa 			BIT16x2(len, extcode);
169e715bfaeSHidetoshi Shimokawa 		} rreqb;
170e715bfaeSHidetoshi Shimokawa 		struct {
17177ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
17277ee030bSHidetoshi Shimokawa 			BIT16x2(src, dest_hi);
17303161bbcSDoug Rabson 			uint32_t dest_lo;
17403161bbcSDoug Rabson 			uint32_t data;
175e715bfaeSHidetoshi Shimokawa 		} wreqq;
176e715bfaeSHidetoshi Shimokawa 		struct {
17777ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
17877ee030bSHidetoshi Shimokawa 			BIT16x2(src, dest_hi);
17903161bbcSDoug Rabson 			uint32_t dest_lo;
18003161bbcSDoug Rabson 			uint32_t data;
181e715bfaeSHidetoshi Shimokawa 		} cyc;
182e715bfaeSHidetoshi Shimokawa 		struct {
18377ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
18477ee030bSHidetoshi Shimokawa 			COMMON_RES(src, rtcode, , );
18503161bbcSDoug Rabson 			uint32_t :32;
18603161bbcSDoug Rabson 			uint32_t data;
187e715bfaeSHidetoshi Shimokawa 		} rresq;
188e715bfaeSHidetoshi Shimokawa 		struct {
18977ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
19077ee030bSHidetoshi Shimokawa 			BIT16x2(src, dest_hi);
19103161bbcSDoug Rabson 			uint32_t dest_lo;
19277ee030bSHidetoshi Shimokawa 			BIT16x2(len, extcode);
19303161bbcSDoug Rabson 			uint32_t payload[0];
194e715bfaeSHidetoshi Shimokawa 		} wreqb;
195e715bfaeSHidetoshi Shimokawa 		struct {
19677ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
19777ee030bSHidetoshi Shimokawa 			BIT16x2(src, dest_hi);
19803161bbcSDoug Rabson 			uint32_t dest_lo;
19977ee030bSHidetoshi Shimokawa 			BIT16x2(len, extcode);
20003161bbcSDoug Rabson 			uint32_t payload[0];
201e715bfaeSHidetoshi Shimokawa 		} lreq;
202e715bfaeSHidetoshi Shimokawa 		struct {
20377ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
20477ee030bSHidetoshi Shimokawa 			COMMON_RES(src, rtcode, , );
20503161bbcSDoug Rabson 			uint32_t :32;
20677ee030bSHidetoshi Shimokawa 			BIT16x2(len, extcode);
20703161bbcSDoug Rabson 			uint32_t payload[0];
208e715bfaeSHidetoshi Shimokawa 		} rresb;
209e715bfaeSHidetoshi Shimokawa 		struct {
21077ee030bSHidetoshi Shimokawa 			COMMON_HDR(dst, tlrt, tcode, pri);
21177ee030bSHidetoshi Shimokawa 			COMMON_RES(src, rtcode, , );
21203161bbcSDoug Rabson 			uint32_t :32;
21377ee030bSHidetoshi Shimokawa 			BIT16x2(len, extcode);
21403161bbcSDoug Rabson 			uint32_t payload[0];
215e715bfaeSHidetoshi Shimokawa 		} lres;
216e715bfaeSHidetoshi Shimokawa 	} mode;
2173c60ba66SKatsushi Kobayashi };
218e715bfaeSHidetoshi Shimokawa 
219c4778b5dSHidetoshi Shimokawa /*
220c4778b5dSHidetoshi Shimokawa  * Response code (rtcode)
221c4778b5dSHidetoshi Shimokawa  */
222c4778b5dSHidetoshi Shimokawa /* The node has successfully completed the command. */
223c4778b5dSHidetoshi Shimokawa #define	RESP_CMP		0
224c4778b5dSHidetoshi Shimokawa /* A resource conflict was detected. The request may be retried. */
225c4778b5dSHidetoshi Shimokawa #define	RESP_CONFLICT_ERROR	4
226c4778b5dSHidetoshi Shimokawa /* Hardware error, data is unavailable. */
227c4778b5dSHidetoshi Shimokawa #define	RESP_DATA_ERROR		5
228c4778b5dSHidetoshi Shimokawa /* A field in the request packet header was set to an unsupported or incorrect
229c4778b5dSHidetoshi Shimokawa  * value, or an invalid transaction was attempted (e.g., a write to a read-only
230c4778b5dSHidetoshi Shimokawa  * address). */
231c4778b5dSHidetoshi Shimokawa #define	RESP_TYPE_ERROR		6
232c4778b5dSHidetoshi Shimokawa /* The destination offset field in the request was set to an address not
233c4778b5dSHidetoshi Shimokawa  * accessible in the destination node. */
234c4778b5dSHidetoshi Shimokawa #define	RESP_ADDRESS_ERROR	7
235c4778b5dSHidetoshi Shimokawa 
236c4778b5dSHidetoshi Shimokawa /*
237c4778b5dSHidetoshi Shimokawa  * Extended transaction code (extcode)
238c4778b5dSHidetoshi Shimokawa  */
239c4778b5dSHidetoshi Shimokawa #define EXTCODE_MASK_SWAP	1
240c4778b5dSHidetoshi Shimokawa #define EXTCODE_CMP_SWAP	2
241c4778b5dSHidetoshi Shimokawa #define EXTCODE_FETCH_ADD	3
242c4778b5dSHidetoshi Shimokawa #define EXTCODE_LITTLE_ADD	4
243c4778b5dSHidetoshi Shimokawa #define EXTCODE_BOUNDED_ADD	5
244c4778b5dSHidetoshi Shimokawa #define EXTCODE_WRAP_ADD	6
245c4778b5dSHidetoshi Shimokawa 
2463c60ba66SKatsushi Kobayashi struct fw_eui64 {
24703161bbcSDoug Rabson 	uint32_t hi, lo;
2483c60ba66SKatsushi Kobayashi };
249c547b896SHidetoshi Shimokawa #define FW_EUI64_BYTE(eui, x) \
250c547b896SHidetoshi Shimokawa 	((((x) < 4)?				\
251c547b896SHidetoshi Shimokawa 		((eui)->hi >> (8 * (3 - (x)))): \
252c547b896SHidetoshi Shimokawa 		((eui)->lo >> (8 * (7 - (x))))	\
253c547b896SHidetoshi Shimokawa 	) & 0xff)
2540981f5f0SHidetoshi Shimokawa #define FW_EUI64_EQUAL(x, y) \
2550981f5f0SHidetoshi Shimokawa 	((x).hi == (y).hi && (x).lo == (y).lo)
256e715bfaeSHidetoshi Shimokawa 
2573c60ba66SKatsushi Kobayashi struct fw_asyreq {
2583c60ba66SKatsushi Kobayashi 	struct fw_asyreq_t {
2593c60ba66SKatsushi Kobayashi 		unsigned char sped;
2603c60ba66SKatsushi Kobayashi 		unsigned int type;
2613c60ba66SKatsushi Kobayashi #define FWASREQNODE	0
2623c60ba66SKatsushi Kobayashi #define FWASREQEUI	1
2633c60ba66SKatsushi Kobayashi #define FWASRESTL	2
2643c60ba66SKatsushi Kobayashi #define FWASREQSTREAM	3
2653c60ba66SKatsushi Kobayashi 		unsigned short len;
2663c60ba66SKatsushi Kobayashi 		union {
2673c60ba66SKatsushi Kobayashi 			struct fw_eui64 eui;
2683c60ba66SKatsushi Kobayashi 		} dst;
2693c60ba66SKatsushi Kobayashi 	} req;
2703c60ba66SKatsushi Kobayashi 	struct fw_pkt pkt;
27103161bbcSDoug Rabson 	uint32_t data[512];
2723c60ba66SKatsushi Kobayashi };
273e715bfaeSHidetoshi Shimokawa 
274c547b896SHidetoshi Shimokawa struct fw_devinfo {
275c547b896SHidetoshi Shimokawa 	struct fw_eui64 eui;
27603161bbcSDoug Rabson 	uint16_t dst;
27703161bbcSDoug Rabson 	uint16_t status;
278c547b896SHidetoshi Shimokawa };
279c547b896SHidetoshi Shimokawa 
280c547b896SHidetoshi Shimokawa #define FW_MAX_DEVLST 70
2813c60ba66SKatsushi Kobayashi struct fw_devlstreq {
28203161bbcSDoug Rabson 	uint16_t n;
28303161bbcSDoug Rabson 	uint16_t info_len;
284c547b896SHidetoshi Shimokawa 	struct fw_devinfo dev[FW_MAX_DEVLST];
2853c60ba66SKatsushi Kobayashi };
286e715bfaeSHidetoshi Shimokawa 
287f25a0888SSean Bruno /*
288f25a0888SSean Bruno  * Defined in IEEE 1394a-2000
289f25a0888SSean Bruno  * 4.3.4.1
290f25a0888SSean Bruno  */
2913c60ba66SKatsushi Kobayashi #define FW_SELF_ID_PORT_CONNECTED_TO_CHILD 3
2923c60ba66SKatsushi Kobayashi #define FW_SELF_ID_PORT_CONNECTED_TO_PARENT 2
2933c60ba66SKatsushi Kobayashi #define FW_SELF_ID_PORT_NOT_CONNECTED 1
2943c60ba66SKatsushi Kobayashi #define FW_SELF_ID_PORT_NOT_EXISTS 0
295a71c4d42SSean Bruno 
296a71c4d42SSean Bruno #define FW_SELF_ID_PAGE0 0
297a71c4d42SSean Bruno #define FW_SELF_ID_PAGE1 1
298a71c4d42SSean Bruno 
29977ee030bSHidetoshi Shimokawa #if BYTE_ORDER == BIG_ENDIAN
30077ee030bSHidetoshi Shimokawa union fw_self_id {
30177ee030bSHidetoshi Shimokawa 	struct {
30203161bbcSDoug Rabson 		uint32_t  id:2,
30377ee030bSHidetoshi Shimokawa 			  phy_id:6,
30477ee030bSHidetoshi Shimokawa 			  sequel:1,
30577ee030bSHidetoshi Shimokawa 			  link_active:1,
30677ee030bSHidetoshi Shimokawa 			  gap_count:6,
30777ee030bSHidetoshi Shimokawa 			  phy_speed:2,
308a71c4d42SSean Bruno 			  reserved:2,
30977ee030bSHidetoshi Shimokawa 			  contender:1,
31077ee030bSHidetoshi Shimokawa 			  power_class:3,
31177ee030bSHidetoshi Shimokawa 			  port0:2,
31277ee030bSHidetoshi Shimokawa 			  port1:2,
31377ee030bSHidetoshi Shimokawa 			  port2:2,
31477ee030bSHidetoshi Shimokawa 			  initiated_reset:1,
31577ee030bSHidetoshi Shimokawa 			  more_packets:1;
31677ee030bSHidetoshi Shimokawa 	} p0;
31777ee030bSHidetoshi Shimokawa 	struct {
31803161bbcSDoug Rabson 		uint32_t
31977ee030bSHidetoshi Shimokawa 			  id:2,
32077ee030bSHidetoshi Shimokawa 			  phy_id:6,
32177ee030bSHidetoshi Shimokawa 			  sequel:1,
32277ee030bSHidetoshi Shimokawa 			  sequence_num:3,
323f25a0888SSean Bruno 			  reserved2:2,
324f25a0888SSean Bruno 			  port3:2,
325f25a0888SSean Bruno 			  port4:2,
326f25a0888SSean Bruno 			  port5:2,
327f25a0888SSean Bruno 			  port6:2,
328f25a0888SSean Bruno 			  port7:2,
329f25a0888SSean Bruno 			  port8:2,
330f25a0888SSean Bruno 			  port9:2,
331f25a0888SSean Bruno 			  port10:2,
332f25a0888SSean Bruno 			  reserved1:1,
33377ee030bSHidetoshi Shimokawa 			  more_packets:1;
33477ee030bSHidetoshi Shimokawa 	} p1;
335f25a0888SSean Bruno 	struct {
336f25a0888SSean Bruno 		uint32_t
337f25a0888SSean Bruno 			  id:2,
338f25a0888SSean Bruno 			  phy_id:6,
339f25a0888SSean Bruno 			  sequel:1,
340f25a0888SSean Bruno 			  sequence_num:3,
341f25a0888SSean Bruno 			  :2,
342f25a0888SSean Bruno 			  port11:2,
343f25a0888SSean Bruno 			  port12:2,
344f25a0888SSean Bruno 			  port13:2,
345f25a0888SSean Bruno 			  port14:2,
346f25a0888SSean Bruno 			  port15:2,
347f25a0888SSean Bruno 			  :8;
348f25a0888SSean Bruno 	} p2;
34977ee030bSHidetoshi Shimokawa };
35077ee030bSHidetoshi Shimokawa #else
3513c60ba66SKatsushi Kobayashi union fw_self_id {
3523c60ba66SKatsushi Kobayashi 	struct {
35303161bbcSDoug Rabson 		uint32_t  more_packets:1,
3543c60ba66SKatsushi Kobayashi 			  initiated_reset:1,
3553c60ba66SKatsushi Kobayashi 			  port2:2,
3563c60ba66SKatsushi Kobayashi 			  port1:2,
3573c60ba66SKatsushi Kobayashi 			  port0:2,
3583c60ba66SKatsushi Kobayashi 			  power_class:3,
3593c60ba66SKatsushi Kobayashi 			  contender:1,
360a71c4d42SSean Bruno 			  reserved:2,
3613c60ba66SKatsushi Kobayashi 			  phy_speed:2,
3623c60ba66SKatsushi Kobayashi 			  gap_count:6,
3633c60ba66SKatsushi Kobayashi 			  link_active:1,
3643c60ba66SKatsushi Kobayashi 			  sequel:1,
3653c60ba66SKatsushi Kobayashi 			  phy_id:6,
3663c60ba66SKatsushi Kobayashi 			  id:2;
3673c60ba66SKatsushi Kobayashi 	} p0;
3683c60ba66SKatsushi Kobayashi 	struct {
36903161bbcSDoug Rabson 		uint32_t  more_packets:1,
3703c60ba66SKatsushi Kobayashi 			  reserved1:1,
371f25a0888SSean Bruno 			  port10:2,
372f25a0888SSean Bruno 			  port9:2,
373f25a0888SSean Bruno 			  port8:2,
374f25a0888SSean Bruno 			  port7:2,
375f25a0888SSean Bruno 			  port6:2,
376f25a0888SSean Bruno 			  port5:2,
377f25a0888SSean Bruno 			  port4:2,
378f25a0888SSean Bruno 			  port3:2,
3793c60ba66SKatsushi Kobayashi 			  reserved2:2,
3803c60ba66SKatsushi Kobayashi 			  sequence_num:3,
3813c60ba66SKatsushi Kobayashi 			  sequel:1,
3823c60ba66SKatsushi Kobayashi 			  phy_id:6,
3833c60ba66SKatsushi Kobayashi 			  id:2;
3843c60ba66SKatsushi Kobayashi 	} p1;
385f25a0888SSean Bruno 	struct {
386f25a0888SSean Bruno 		uint32_t
387f25a0888SSean Bruno 			  reserved3:8,
388f25a0888SSean Bruno 			  port15:2,
389f25a0888SSean Bruno 			  port14:2,
390f25a0888SSean Bruno 			  port13:2,
391f25a0888SSean Bruno 			  port12:2,
392f25a0888SSean Bruno 			  port11:2,
393f25a0888SSean Bruno 			  reserved4:2,
394f25a0888SSean Bruno 			  sequence_num:3,
395f25a0888SSean Bruno 			  sequel:1,
396f25a0888SSean Bruno 			  phy_id:6,
397f25a0888SSean Bruno 			  id:2;
398f25a0888SSean Bruno 	} p2;
3993c60ba66SKatsushi Kobayashi };
400e715bfaeSHidetoshi Shimokawa #endif
401e715bfaeSHidetoshi Shimokawa 
402e715bfaeSHidetoshi Shimokawa 
4033c60ba66SKatsushi Kobayashi struct fw_topology_map {
40403161bbcSDoug Rabson 	uint32_t crc:16,
4053c60ba66SKatsushi Kobayashi 		 crc_len:16;
40603161bbcSDoug Rabson 	uint32_t generation;
40703161bbcSDoug Rabson 	uint32_t self_id_count:16,
4083c60ba66SKatsushi Kobayashi 		 node_count:16;
4093c60ba66SKatsushi Kobayashi 	union fw_self_id self_id[4 * 64];
4103c60ba66SKatsushi Kobayashi };
411e715bfaeSHidetoshi Shimokawa 
4123c60ba66SKatsushi Kobayashi struct fw_speed_map {
41303161bbcSDoug Rabson 	uint32_t crc:16,
4143c60ba66SKatsushi Kobayashi 		 crc_len:16;
41503161bbcSDoug Rabson 	uint32_t generation;
41603161bbcSDoug Rabson 	uint8_t  speed[64][64];
4173c60ba66SKatsushi Kobayashi };
418e715bfaeSHidetoshi Shimokawa 
4193c60ba66SKatsushi Kobayashi struct fw_crom_buf {
4203c60ba66SKatsushi Kobayashi 	struct fw_eui64 eui;
421e340a7acSHidetoshi Shimokawa 	uint32_t len;
4223c60ba66SKatsushi Kobayashi 	void *ptr;
4233c60ba66SKatsushi Kobayashi };
424e715bfaeSHidetoshi Shimokawa 
4253c60ba66SKatsushi Kobayashi /*
426ee126d67SHidetoshi Shimokawa  * FireWire specific system requests.
4273c60ba66SKatsushi Kobayashi  */
4283c60ba66SKatsushi Kobayashi #define	FW_SSTBUF	_IOWR('S', 86, struct fw_isobufreq)
4293c60ba66SKatsushi Kobayashi #define	FW_GSTBUF	_IOWR('S', 87, struct fw_isobufreq)
4303c60ba66SKatsushi Kobayashi #define	FW_SRSTREAM	_IOWR('S', 88, struct fw_isochreq)
4313c60ba66SKatsushi Kobayashi #define	FW_GRSTREAM	_IOWR('S', 89, struct fw_isochreq)
4323c60ba66SKatsushi Kobayashi #define	FW_STSTREAM	_IOWR('S', 90, struct fw_isochreq)
4333c60ba66SKatsushi Kobayashi #define	FW_GTSTREAM	_IOWR('S', 91, struct fw_isochreq)
4343c60ba66SKatsushi Kobayashi 
4353c60ba66SKatsushi Kobayashi #define	FW_ASYREQ	_IOWR('S', 92, struct fw_asyreq)
4363c60ba66SKatsushi Kobayashi #define FW_IBUSRST	_IOR('S', 1, unsigned int)
4373c60ba66SKatsushi Kobayashi #define FW_GDEVLST	_IOWR('S', 2, struct fw_devlstreq)
4383c60ba66SKatsushi Kobayashi #define	FW_SBINDADDR	_IOWR('S', 3, struct fw_asybindreq)
4393c60ba66SKatsushi Kobayashi #define	FW_CBINDADDR	_IOWR('S', 4, struct fw_asybindreq)
4403c60ba66SKatsushi Kobayashi #define	FW_GTPMAP	_IOR('S', 5, struct fw_topology_map)
4413c60ba66SKatsushi Kobayashi #define	FW_GCROM	_IOWR('S', 7, struct fw_crom_buf)
4423c60ba66SKatsushi Kobayashi 
443233b1b97SHidetoshi Shimokawa #define	FW_SDEUI64	_IOW('S', 20, struct fw_eui64)
444233b1b97SHidetoshi Shimokawa #define	FW_GDEUI64	_IOR('S', 21, struct fw_eui64)
445233b1b97SHidetoshi Shimokawa 
4463c60ba66SKatsushi Kobayashi #define FWOHCI_RDREG	_IOWR('S', 80, struct fw_reg_req_t)
4473c60ba66SKatsushi Kobayashi #define FWOHCI_WRREG	_IOWR('S', 81, struct fw_reg_req_t)
448f9c8c31dSHidetoshi Shimokawa #define FWOHCI_RDPHYREG	_IOWR('S', 82, struct fw_reg_req_t)
449f9c8c31dSHidetoshi Shimokawa #define FWOHCI_WRPHYREG	_IOWR('S', 83, struct fw_reg_req_t)
4503c60ba66SKatsushi Kobayashi 
45103161bbcSDoug Rabson #define DUMPDMA		_IOWR('S', 82, uint32_t)
4523c60ba66SKatsushi Kobayashi 
4533c60ba66SKatsushi Kobayashi #ifdef _KERNEL
4543c60ba66SKatsushi Kobayashi 
4553c60ba66SKatsushi Kobayashi #define FWMAXNDMA 0x100 /* 8 bits DMA channel id. in device No. */
4563c60ba66SKatsushi Kobayashi 
457a160e00eSHidetoshi Shimokawa #define MAKEMINOR(f, u, s)	\
4586bfa9a2dSEd Schouten 	((f) | (((u) & 0xff) << 8) | (s & 0xff))
4593c60ba66SKatsushi Kobayashi #define DEV2UNIT(x)	((dev2unit(x) & 0xff00) >> 8)
4606cada79aSHidetoshi Shimokawa #define DEV2SUB(x)	(dev2unit(x) & 0xff)
4613c60ba66SKatsushi Kobayashi 
4623c60ba66SKatsushi Kobayashi #define FWMEM_FLAG	0x10000
4633c60ba66SKatsushi Kobayashi #define DEV_FWMEM(x)	(dev2unit(x) & FWMEM_FLAG)
4643c60ba66SKatsushi Kobayashi #endif
4653c60ba66SKatsushi Kobayashi #endif
466