1 /* $NetBSD: firewire.h,v 1.5 2010/03/29 03:05:27 kiyohara Exp $ */ 2 /*- 3 * Copyright (c) 2003 Hidetoshi Shimokawa 4 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa 5 * All rights reserved. 6 * 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: 17 * 18 * This product includes software developed by K. Kobayashi and H. Shimokawa 19 * 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. 22 * 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. 34 * 35 * $FreeBSD: src/sys/dev/firewire/firewire.h,v 1.25 2009/02/17 19:37:04 sbruno Exp $ 36 * 37 */ 38 39 #ifndef _FIREWIRE_H_ 40 #define _FIREWIRE_H_ 41 42 #define DEV_DEF 0 43 #define DEV_DV 2 44 45 struct fw_isochreq { 46 unsigned char ch:6, 47 tag:2; 48 }; 49 50 struct fw_isobufreq { 51 struct fw_bufspec { 52 unsigned int nchunk; 53 unsigned int npacket; 54 unsigned int psize; 55 } tx, rx; 56 }; 57 58 struct fw_addr { 59 uint32_t hi; 60 uint32_t lo; 61 }; 62 63 struct fw_asybindreq { 64 struct fw_addr start; 65 unsigned long len; 66 }; 67 68 struct fw_reg_req_t { 69 uint32_t addr; 70 uint32_t data; 71 }; 72 73 #define MAXREC(x) (2 << (x)) 74 #define FWPMAX_S400 (2048 + 20) /* MAXREC plus space for control data */ 75 #define FWMAXQUEUE 256 76 77 #define FWLOCALBUS 0xffc0 78 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 91 92 #define FWRETRY_1 0 93 #define FWRETRY_X 1 94 #define FWRETRY_A 2 95 #define FWRETRY_B 3 96 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 102 103 /* 104 * Defined 1394a-2000 105 * Table 5B-1 106 */ 107 #define FWSPD_S100 0 108 #define FWSPD_S200 1 109 #define FWSPD_S400 2 110 #define FWSPD_S800 3 111 #define FWSPD_S1600 4 112 #define FWSPD_S3200 5 113 114 #define FWP_TL_VALID (1 << 7) 115 116 struct fw_isohdr { 117 uint32_t hdr[1]; 118 }; 119 120 struct fw_asyhdr { 121 uint32_t hdr[4]; 122 }; 123 124 #if BYTE_ORDER == BIG_ENDIAN 125 #define BIT4x2(x,y) uint8_t x:4, y:4 126 #define BIT16x2(x,y) uint32_t x:16, y:16 127 #else 128 #define BIT4x2(x,y) uint8_t y:4, x:4 129 #define BIT16x2(x,y) uint32_t y:16, x:16 130 #endif 131 132 133 #if BYTE_ORDER == BIG_ENDIAN 134 #define COMMON_HDR(a,b,c,d) uint32_t a:16,b:8,c:4,d:4 135 #define COMMON_RES(a,b,c,d) uint32_t a:16,b:4,c:4,d:8 136 #else 137 #define COMMON_HDR(a,b,c,d) uint32_t d:4,c:4,b:8,a:16 138 #define COMMON_RES(a,b,c,d) uint32_t d:8,c:4,b:4,a:16 139 #endif 140 141 struct fw_pkt { 142 union { 143 uint32_t ld[0]; 144 struct { 145 COMMON_HDR(, , tcode, ); 146 } common; 147 struct { 148 COMMON_HDR(len, chtag, tcode, sy); 149 uint32_t payload[0]; 150 } stream; 151 struct { 152 COMMON_HDR(dst, tlrt, tcode, pri); 153 BIT16x2(src, ); 154 } hdr; 155 struct { 156 COMMON_HDR(dst, tlrt, tcode, pri); 157 BIT16x2(src, dest_hi); 158 uint32_t dest_lo; 159 } rreqq; 160 struct { 161 COMMON_HDR(dst, tlrt, tcode, pri); 162 COMMON_RES(src, rtcode, , ); 163 uint32_t :32; 164 } wres; 165 struct { 166 COMMON_HDR(dst, tlrt, tcode, pri); 167 BIT16x2(src, dest_hi); 168 uint32_t dest_lo; 169 BIT16x2(len, extcode); 170 } rreqb; 171 struct { 172 COMMON_HDR(dst, tlrt, tcode, pri); 173 BIT16x2(src, dest_hi); 174 uint32_t dest_lo; 175 uint32_t data; 176 } wreqq; 177 struct { 178 COMMON_HDR(dst, tlrt, tcode, pri); 179 BIT16x2(src, dest_hi); 180 uint32_t dest_lo; 181 uint32_t data; 182 } cyc; 183 struct { 184 COMMON_HDR(dst, tlrt, tcode, pri); 185 COMMON_RES(src, rtcode, , ); 186 uint32_t :32; 187 uint32_t data; 188 } rresq; 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 } wreqb; 196 struct { 197 COMMON_HDR(dst, tlrt, tcode, pri); 198 BIT16x2(src, dest_hi); 199 uint32_t dest_lo; 200 BIT16x2(len, extcode); 201 uint32_t payload[0]; 202 } lreq; 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 } rresb; 210 struct { 211 COMMON_HDR(dst, tlrt, tcode, pri); 212 COMMON_RES(src, rtcode, , ); 213 uint32_t :32; 214 BIT16x2(len, extcode); 215 uint32_t payload[0]; 216 } lres; 217 } mode; 218 }; 219 220 /* 221 * Response code (rtcode) 222 */ 223 /* The node has successfully completed the command. */ 224 #define RESP_CMP 0 225 /* A resource conflict was detected. The request may be retried. */ 226 #define RESP_CONFLICT_ERROR 4 227 /* Hardware error, data is unavailable. */ 228 #define RESP_DATA_ERROR 5 229 /* A field in the request packet header was set to an unsupported or incorrect 230 * value, or an invalid transaction was attempted (e.g., a write to a read-only 231 * address). */ 232 #define RESP_TYPE_ERROR 6 233 /* The destination offset field in the request was set to an address not 234 * accessible in the destination node. */ 235 #define RESP_ADDRESS_ERROR 7 236 237 /* 238 * Extended transaction code (extcode) 239 */ 240 #define EXTCODE_MASK_SWAP 1 241 #define EXTCODE_CMP_SWAP 2 242 #define EXTCODE_FETCH_ADD 3 243 #define EXTCODE_LITTLE_ADD 4 244 #define EXTCODE_BOUNDED_ADD 5 245 #define EXTCODE_WRAP_ADD 6 246 247 struct fw_eui64 { 248 uint32_t hi, lo; 249 }; 250 #define FW_EUI64_BYTE(eui, x) \ 251 ((((x)<4)? \ 252 ((eui)->hi >> (8*(3-(x)))): \ 253 ((eui)->lo >> (8*(7-(x)))) \ 254 ) & 0xff) 255 #define FW_EUI64_EQUAL(x, y) \ 256 ((x).hi == (y).hi && (x).lo == (y).lo) 257 258 struct fw_asyreq { 259 struct fw_asyreq_t{ 260 unsigned char sped; 261 unsigned int type; 262 #define FWASREQNODE 0 263 #define FWASREQEUI 1 264 #define FWASRESTL 2 265 #define FWASREQSTREAM 3 266 unsigned short len; 267 union { 268 struct fw_eui64 eui; 269 }dst; 270 }req; 271 struct fw_pkt pkt; 272 uint32_t data[512]; 273 }; 274 275 struct fw_devinfo { 276 struct fw_eui64 eui; 277 uint16_t dst; 278 uint16_t status; 279 }; 280 281 #define FW_MAX_DEVLST 70 282 struct fw_devlstreq { 283 uint16_t n; 284 uint16_t info_len; 285 struct fw_devinfo dev[FW_MAX_DEVLST]; 286 }; 287 288 /* 289 * Defined in IEEE 1394a-2000 290 * 4.3.4.1 291 */ 292 #define FW_SELF_ID_PORT_CONNECTED_TO_CHILD 3 293 #define FW_SELF_ID_PORT_CONNECTED_TO_PARENT 2 294 #define FW_SELF_ID_PORT_NOT_CONNECTED 1 295 #define FW_SELF_ID_PORT_NOT_EXISTS 0 296 297 #define FW_SELF_ID_PAGE0 0 298 #define FW_SELF_ID_PAGE1 1 299 300 #if BYTE_ORDER == BIG_ENDIAN 301 union fw_self_id { 302 struct { 303 uint32_t id:2, 304 phy_id:6, 305 sequel:1, 306 link_active:1, 307 gap_count:6, 308 phy_speed:2, 309 reserved:2, 310 contender:1, 311 power_class:3, 312 port0:2, 313 port1:2, 314 port2:2, 315 initiated_reset:1, 316 more_packets:1; 317 } p0; 318 struct { 319 uint32_t 320 id:2, 321 phy_id:6, 322 sequel:1, 323 sequence_num:3, 324 reserved2:2, 325 port3:2, 326 port4:2, 327 port5:2, 328 port6:2, 329 port7:2, 330 port8:2, 331 port9:2, 332 port10:2, 333 reserved1:1, 334 more_packets:1; 335 } p1; 336 struct { 337 uint32_t 338 id:2, 339 phy_id:6, 340 sequel:1, 341 sequence_num:3, 342 :2, 343 port11:2, 344 port12:2, 345 port13:2, 346 port14:2, 347 port15:2, 348 :8; 349 } p2; 350 }; 351 #else 352 union fw_self_id { 353 struct { 354 uint32_t more_packets:1, 355 initiated_reset:1, 356 port2:2, 357 port1:2, 358 port0:2, 359 power_class:3, 360 contender:1, 361 reserved:2, 362 phy_speed:2, 363 gap_count:6, 364 link_active:1, 365 sequel:1, 366 phy_id:6, 367 id:2; 368 } p0; 369 struct { 370 uint32_t more_packets:1, 371 reserved1:1, 372 port10:2, 373 port9:2, 374 port8:2, 375 port7:2, 376 port6:2, 377 port5:2, 378 port4:2, 379 port3:2, 380 reserved2:2, 381 sequence_num:3, 382 sequel:1, 383 phy_id:6, 384 id:2; 385 } p1; 386 struct { 387 uint32_t 388 reserved3:8, 389 port15:2, 390 port14:2, 391 port13:2, 392 port12:2, 393 port11:2, 394 reserved4:2, 395 sequence_num:3, 396 sequel:1, 397 phy_id:6, 398 id:2; 399 } p2; 400 }; 401 #endif 402 403 404 struct fw_topology_map { 405 uint32_t crc:16, 406 crc_len:16; 407 uint32_t generation; 408 uint32_t self_id_count:16, 409 node_count:16; 410 union fw_self_id self_id[4*64]; 411 }; 412 413 struct fw_speed_map { 414 uint32_t crc:16, 415 crc_len:16; 416 uint32_t generation; 417 uint8_t speed[64][64]; 418 }; 419 420 struct fw_crom_buf { 421 struct fw_eui64 eui; 422 uint32_t len; 423 void *ptr; 424 }; 425 426 /* 427 * FireWire specific system requests. 428 */ 429 #define FW_SSTBUF _IOWR('S', 86, struct fw_isobufreq) 430 #define FW_GSTBUF _IOWR('S', 87, struct fw_isobufreq) 431 #define FW_SRSTREAM _IOWR('S', 88, struct fw_isochreq) 432 #define FW_GRSTREAM _IOWR('S', 89, struct fw_isochreq) 433 #define FW_STSTREAM _IOWR('S', 90, struct fw_isochreq) 434 #define FW_GTSTREAM _IOWR('S', 91, struct fw_isochreq) 435 436 #define FW_ASYREQ _IOWR('S', 92, struct fw_asyreq) 437 #define FW_IBUSRST _IOR('S', 1, unsigned int) 438 #define FW_GDEVLST _IOWR('S', 2, struct fw_devlstreq) 439 #define FW_SBINDADDR _IOWR('S', 3, struct fw_asybindreq) 440 #define FW_CBINDADDR _IOWR('S', 4, struct fw_asybindreq) 441 #define FW_GTPMAP _IOR('S', 5, struct fw_topology_map) 442 #define FW_GCROM _IOWR('S', 7, struct fw_crom_buf) 443 444 #define FW_SDEUI64 _IOW('S', 20, struct fw_eui64) 445 #define FW_GDEUI64 _IOR('S', 21, struct fw_eui64) 446 447 #define FWOHCI_RDREG _IOWR('S', 80, struct fw_reg_req_t) 448 #define FWOHCI_WRREG _IOWR('S', 81, struct fw_reg_req_t) 449 #define FWOHCI_RDPHYREG _IOWR('S', 82, struct fw_reg_req_t) 450 #define FWOHCI_WRPHYREG _IOWR('S', 83, struct fw_reg_req_t) 451 452 #define DUMPDMA _IOWR('S', 82, uint32_t) 453 454 #ifdef _KERNEL 455 456 #define FWMAXNDMA 0x100 /* 8 bits DMA channel id. in device No. */ 457 458 #define unit2minor(x) (((x) & 0xff) | (((x) << 12) & ~0xfffff)) 459 #define MAKEMINOR(f, u, s) ((f) | (((u) & 0xff) << 8) | ((s) & 0xff)) 460 #define DEV2UNIT(x) ((minor(x) & 0xff00) >> 8) 461 #define DEV2SUB(x) (minor(x) & 0xff) 462 #define FW_UNITMASK MAKEMINOR(0, -1, 0) 463 #define FW_UNIT(unit) MAKEMINOR(0, unit, 0) 464 465 #define FWMEM_FLAG 0x10000 466 #define DEV_FWMEM(x) (minor(x) & FWMEM_FLAG) 467 468 struct fw_attach_args { 469 const char *name; 470 struct firewire_comm *fc; 471 struct fw_device *fwdev; 472 }; 473 474 #endif 475 #endif /* _FIREWIRE_H_ */ 476